如何在写入文件时以编程方式强制 Windows 更新文件报告的磁盘大小?

Jer*_*ner 6 c winapi file filesize

我有一个程序,可以打开一个 ASCII 日志文件,并在事件发生时将文本行写入该文件的末尾。事件发生的时间是不可预测的;它们可能每秒发生多次,也可能每隔几个小时发生一次。

这一切都很好;当程序运行时我想查看日志文件的当前大小时,问题就出现了。在 Windows 下,如果我进入dirDOS shell,日志文件的大小显示为 0 字节,直到我的程序关闭日志文件。(有趣的是,如果我执行 a dir my_file_name.log,文件的大小会更新,但只是普通dir不会更新文件大小)

这没有我想要的那么有用;然而,根据SuperUser.com 上的这个问题/答案,这种行为是 Windows 操作系统的一项“功能”。答案甚至给出了一种破解方法来强制更新文件大小数字(通过进入type my_file_name.log > nulDOS 框)。

我的问题是,是否有某种编程方式可以从我的程序中强制进行相同的更新?我希望至少能够偶尔强制显示正确的尺寸,而不必告诉用户手动执行解决方法步骤。

type我尝试通过对日志文件的文件路径进行单独的调用来模拟程序内fopen()的行为fclose(),但它似乎没有任何效果。

我还尝试通过调用日志文件的文件句柄来强制解决此问题fclose(),然后立即以附加模式重新打开文件(fopen()再次通过),但由于某种原因fopen()调用失败。(无论如何,我真的不想这样做,因为重新打开文件可能会失败,使我的程序处于不希望的状态)

请参阅下面的玩具示例程序:

#include <stdio.h>

int main(int args, char ** argv)
{
   FILE * fpOut = fopen("my_log_file.txt", "w");
   if (fpOut)
   {
      for (int i=0; i<1000; i++)
      {
         fprintf(fpOut, "Event %i occurred\n", i);
         fflush(fpOut);

         Sleep(1000);

         // is there something I could call here to make the file's new size visible to the world?
      }
      fclose(fpOut);
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Iły*_*sov 0

您可以按照链接端口的建议进行操作:打开和关闭它

人们可以使用任何打开文件(创建单独的 SFT 条目)并再​​次关闭它的方法。它可以像在另一个控制台/会话中运行的 type 命令一样简单:type file > nul

尝试这样的事情:

if ((i % 10) == 0) {
    FILE* tmp = fopen("my_log_file.txt", "r");
    if (tmp) fclose(tmp);
}
Run Code Online (Sandbox Code Playgroud)

注意:它打开新的描述并关闭它,原来写的不受影响