Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何强制文件刷新_C++_Windows_File_Io - Fatal编程技术网

C++ 如何强制文件刷新

C++ 如何强制文件刷新,c++,windows,file,io,C++,Windows,File,Io,假设我有以下代码: #include <chrono> #include <fstream> #include <thread> int main() { std::ofstream f("test.log"); int i = 0; while (true) { f << i++; f.flush(); std::this_thread::sleep_for(std::chrono::millisec

假设我有以下代码:

#include <chrono>
#include <fstream>
#include <thread>

int main()
{
  std::ofstream f("test.log");

  int i = 0;
  while (true)
  {
    f << i++;
    f.flush();

    std::this_thread::sleep_for(std::chrono::milliseconds(100));
  }
}
#包括
#包括
#包括
int main()
{
标准::流f(“test.log”);
int i=0;
while(true)
{

这里有两个独立的东西。首先,文件MFT记录上的上次修改时间(相当于inode)在每次写入时都会更新

但是,
FindFirstFile
和friends返回的信息不是来自文件,而是来自目录项中缓存的信息。每当关闭通过该目录项打开的文件时,该缓存都会更新。这是大多数应用程序显示的信息,如Windows资源管理器和命令prompt DIR命令

如果想知道文件何时更新,需要执行与读取MFT记录(inode)的Unix
stat
操作等效的操作。这需要打开文件句柄,调用
GetFileInformationByHandle
并再次关闭句柄

第二件事是,有一个很好的理由不这样做。如果一个程序正在写入一个文件,它可能在写入过程的中途。因此,该文件可能处于无效(损坏)状态状态。要确保文件处于有效状态,您应该等待文件关闭。这就是您现在可以查看文件的方式

一旦写入程序完成对文件的写入,目录条目将被更新,FileSystemWatcher将显示该文件


如果您绝对确定要查看仍在写入过程中的文件通知,那么您可以查看USN更改日志作为一个选项。我不知道这是否比目录条目更为最新,您必须对此进行调查。

我认为您正遭受标准windows缓冲的困扰,例如在网络驱动器上尤其常见。如果没有,it不会立即注意到,那么你就注定要等到windows确认对磁盘的写入-这也可能是由磁盘缓冲造成的,因为尽管这没有多大意义,因为windows缓冲写操作,如果windows还没有实际提交,其他部分就看不到it@Jovasa总司令也有同样的想法behavior@BugFinder我明白了。但我还是有一个问题要解决。我需要找到一种正确的方法来强制其他应用程序所做的
刷新
我注意到这个应用程序没有更新“test.log”的“last modified time”和“size”属性文件,除非我右键单击此文件或打开它。这听起来更像是用于查看和使用鼠标打开文件的GUI应用程序的问题。尝试编写这样的应用程序。类似于每秒获取文件状态一次的程序。可能此程序会检测到更改。我需要注意特定目录中的文件更改。目前,我不能依赖C#中的
FileSystemWatcher
class。然后我能做什么?手动迭代目录中的所有文件,打开它并观察更改?因此,
flush
ing文件确实会将任何缓冲内容写入磁盘,对吗?因为我不确定Windows是否s Explorer/Total Commander仅显示缓存的文件信息(例如上次修改时间和大小)或者,只有当我在应用程序中右键单击/打开该文件/关闭它时,系统才真正刷新内部缓冲区刷新文件将内容写入磁盘。它只是不更新目录项。请注意,您不需要执行open getfileinformationbyhandle close循环,您可以在应用程序上重复调用getfileinformationbyhandle相同的句柄。(打开文件时,您需要将访问掩码指定为0,否则您的句柄和其他程序的句柄将相互干扰。)