我有一个程序可以打开一个 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;
}
您可以完全按照链接端口的建议进行操作:打开和关闭它,尝试类似的操作:
if ((i % 10) == 0) {
FILE* tmp = fopen("my_log_file.txt", "r");
if (tmp) fclose(tmp);
}
注意:它打开新的描述并关闭它,原写一个不受影响