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;
}
您可以按照链接端口的建议进行操作:打开和关闭它
人们可以使用任何打开文件(创建单独的 SFT 条目)并再次关闭它的方法。它可以像在另一个控制台/会话中运行的 type 命令一样简单:
type file > nul
尝试这样的事情:
if ((i % 10) == 0) {
    FILE* tmp = fopen("my_log_file.txt", "r");
    if (tmp) fclose(tmp);
}
注意:它打开新的描述并关闭它,原来写的不受影响
| 归档时间: | 
 | 
| 查看次数: | 118 次 | 
| 最近记录: |