当文件存在并与 onedrive 同步时,_open 失败并显示 O_TRUNC
Posted
技术标签:
【中文标题】当文件存在并与 onedrive 同步时,_open 失败并显示 O_TRUNC【英文标题】:_open fails with O_TRUNC when file exists and is synced with onedrive 【发布时间】:2021-10-27 11:59:59 【问题描述】:我发现了以下行为,并想了解函数调用失败的原因以及是否有修复或解决方法。
我已使用以下最小 C/C++ 代码 sn-p 隔离了该行为
#include<io.h>
int main()
char path[] = "C:\\Users\\<my_username>\\OneDrive - <my_employer>\\Documents\\file.bin";
int fh = _open(path, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, _S_IREAD | _S_IWRITE);
if (fh >= 0)
_write(fh, "somebytes", 9);
_close(fh);
else
int err = errno;
char* message = strerror(err);
return 0;
为了匿名,我已从我的 onedrive 文件夹中删除了我的用户名和雇主名称。
如果该文件尚不存在,则该文件将创建一个文件并按预期填充适当的文本。
如果文件存在,但尚未同步到我的 onedrive,则文件将按预期打开、截断并填充适当的文本。
但是,如果文件存在并且已同步到我的 onedrive,则 _open
调用将失败并且 errno
设置为 EINVAL
(无效参数)。
从_open
调用中删除O_TRUNC
会阻止函数失败,但没有所需的行为。 IE。文件在写入前不会被截断。
也许值得注意的是,从https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen 的微软文档中,EINVAL
似乎是一个奇怪的错误代码,考虑到这些症状。
我的 OneDrive 是 2021 版(内部版本 21.150.0725.0001 64 位)
以前有没有人遇到过这个问题并有解决方案或解决方法?
在我的特殊情况下,像上面的 sn-p 这样的代码被用作 netcdf/hdf5 文件格式库的一部分,这导致我的文件写入失败。我还遇到了一个问题,我无法将 Visual Studio 项目存储在我的 onedrive 文件夹中,因为一旦它们同步,在构建过程中就无法覆盖各种文件 - 我现在想知道这是否是由于同一个问题造成的。
编辑 - 我的家用电脑上似乎没有同样的问题。仅在我的工作计算机上 - OneDrive 的商业版是基于 Sharepoint 构建的吗?如果是这样,也许这会有所作为。
【问题讨论】:
测试应该是fh >= 0
,因为 0 是一个有效的文件描述符,但这可能不是真正的问题。
谢谢 - 编辑代码。但你是对的,这不是这里的问题,因为文件描述符在我的测试中返回 3 或 -1。
GetLastError 应该提供比 errno 更准确的错误代码。另请查看 _chsize 和 SetEndOfFile。
【参考方案1】:
我建议您不要使用 One Drive 来“备份”源代码,而是使用源代码控制系统 - GitHub 或 Azure Dev Ops 都提供免费版本
【讨论】:
Visual Studio 的问题只是问题的一个症状。另外,git 中的良好实践是将更改提交为有用的有意义的更改,而不仅仅是每小时或每天的备份。源代码管理和备份是两个不同的东西。以上是关于当文件存在并与 onedrive 同步时,_open 失败并显示 O_TRUNC的主要内容,如果未能解决你的问题,请参考以下文章
如何检测 OneDrive for Business 正在同步哪些文件夹
微软网盘 | Microsoft office同步盘--Microsoft OneDrive安卓版端更新