我有一个程序,它打开一个ASCII日志文件,并在事件发生时向其末尾写入文本行。事件的时间是不可预测的;它们可能每秒发生多次,也可能每隔几个小时才发生一次。
这一切都很好;问题出现在当我想在程序运行时查看日志文件的当前大小时。在Windows下,如果我在DOS shell中输入dir,直到我的程序关闭日志文件之前,日志文件的大小显示为0字节。(有趣的是,如果我执行dir my_file_name.log,则文件的大小会更新,但只有一个普通的dir不会更新文件大小)
这比我想要的要少用一些;然而根据SuperUser.com上这个问题/答案(链接),这种行为是Windows操作系统的“特性”。该答案甚至提供了一个hack解决方法来强制更新文件大小(通过在DOS框中输入type my_file_name.log > nul)。
这一切都很好;问题出现在当我想在程序运行时查看日志文件的当前大小时。在Windows下,如果我在DOS shell中输入dir,直到我的程序关闭日志文件之前,日志文件的大小显示为0字节。(有趣的是,如果我执行dir my_file_name.log,则文件的大小会更新,但只有一个普通的dir不会更新文件大小)
这比我想要的要少用一些;然而根据SuperUser.com上这个问题/答案(链接),这种行为是Windows操作系统的“特性”。该答案甚至提供了一个hack解决方法来强制更新文件大小(通过在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;
}
ftell
吗? - Jonathan PotterGetFileAttributesW
函数。 - RbMm