C++ 如何仅在检测到的文件更改完成时而不是在开始时获得正确的文件大小?

C++ 如何仅在检测到的文件更改完成时而不是在开始时获得正确的文件大小?,c++,file,stat,libuv,C++,File,Stat,Libuv,我正在使用libuv监视文件更改。一旦检测到更改,我将在回调uv\u fs\u event\u cb中打开该文件 但是,我的程序在打开文件时还需要获得完整的文件大小,这样我就知道根据文件大小分配多少内存。我发现无论我使用libuv的uv\u fs\u fstat还是POSIX的stat/stat64,或者fseek+ftell我都无法立即获得正确的文件大小。这是因为当我的程序打开文件时,文件仍在更新 我的程序运行在一个有回调的紧密单线程中,因此延迟/睡眠不是这里的最佳选择(也不能保证正确性) 是

我正在使用libuv监视文件更改。一旦检测到更改,我将在回调
uv\u fs\u event\u cb
中打开该文件

但是,我的程序在打开文件时还需要获得完整的文件大小,这样我就知道根据文件大小分配多少内存。我发现无论我使用libuv的
uv\u fs\u fstat
还是POSIX的
stat/stat64
,或者
fseek+ftell
我都无法立即获得正确的文件大小。这是因为当我的程序打开文件时,文件仍在更新

我的程序运行在一个有回调的紧密单线程中,因此延迟/睡眠不是这里的最佳选择(也不能保证正确性)


是否有任何方法可以在使用或不使用libuv的情况下处理此问题,这样我就可以(比如)推迟打开和读取文件,直到完成对文件的写入?换句话说,与其立即检测文件事件更改的开始,我是否可以以某种方式检测文件更改的完成?

一种方法是让编写器创建一个中间文件,并通过将其重命名为目标文件来完成I/O。e、 g.这是大多数浏览器中都会发生的情况,在下载完成之前,该文件都有一个“downloading.tmp”名称,以阻止您打开它

另一种方法是在写入主目标文件之后写入/触摸一个“完成”的文件,并在读卡器开始工作之前等待查看该文件

我看到的最后一个选项是,如果文件格式可以稍微更改,让编写器将文件大小打印为文件的第一个字节,那么即使文件未完全写入,读取器也可以正确预分配,然后它将坚持读取所有数据


总的来说,我建议不要使用完成事件,而是让编写器在完成任务后生成任何可以监视的事件,并让读卡器等待/同步该事件。

您看过
sync()
fsync()
确保在确定文件系统大小之前刷新所有文件系统更改?我认为libuv无法告诉您更改何时完成。如果您在Linux上,可以使用inotify,它可以配置为在文件关闭时发出通知。但是,您必须编写自己的事件处理程序,谢谢!我将尝试将写入临时文件和移动相结合,并在文件大小上添加序言头。