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

问题描述 投票:0回答:1

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

一切正常;当我想在程序运行时查看日志文件的当前大小时,问题就来了。在 Windows 下,如果我在 DOS shell 中输入

dir
,日志文件的大小显示为 0 字节,直到我的程序关闭日志文件。 (有趣的是,如果我执行
dir my_file_name.log
,文件的大小会更新,但只是一个普通的
dir
不会更新文件大小)

这没有我想要的那么有用;然而,根据 SuperUser.com 上的这个问题/答案,该行为是 Windows 操作系统的“功能”。答案甚至给出了一个 hack work-around 来强制更新文件大小数字(通过在 DOS 框中输入

type my_file_name.log > nul
)。

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

我尝试在我的程序中模拟

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;
}
c file winapi filesize
1个回答
0
投票

您可以完全按照链接端口的建议进行操作:打开和关闭它,尝试类似的操作:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.