当文件存在并与 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 &gt;= 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安卓版端更新

OneDrive 同步任意文件夹方法

Office 365: OneDrive for Business _ 文件随选功能

Onedrive同步其它盘文件夹

Onedrive同步其它盘文件夹