一般来说,一旦文件的句柄打开,文件就打开了,任何改变目录结构的人都无法改变它——文件可以移动、重命名或放置其他东西——它通过构造保持打开状态,如在 Linux/Unix 中,文件没有真正的删除,而只有unlink
,这不一定会删除文件 - 它只是从目录中删除链接。结果:无论文件发生什么,文件句柄都将保持有效。
但是,如果底层设备消失(例如,文件位于从系统中删除的 USB 记忆棒上),则该文件将无法再访问。
我有一个程序在启动时会打开一个其他应用程序的巨大二进制文件(> 4 GB)。之后,它通过查询来监视文件的更改
long int pos = fseek(filepointer, 0L, SEEK_END);
经常(每隔几毫秒)并恢复到以前的位置,如果结果不同于pos_before
. 在这种情况下,fgets
用于从文件中读取新数据。
因此,仅扫描文件的尾部以进行更改,从而使整个过程相当轻巧。但是,如果文件系统更改(见上文),则始终打开的文件指针可能会变得无效,这会受到潜在问题的影响。
代码不需要移植到任何非 Linux/Unix 系统。
问题:
- 成功打开文件后如何检测文件指针是否仍然有效(此事件可能在几周前)?我已经看到一个可能可以
fcntl(fileno(filepointer), F_GETFD)
用于测试。
替代问题:
- 以另一种方式检测文件大小的变化是否可行?我可以考虑定期使用
fseek(filepointer, 0L, SEEK_END);
(可能非常慢并导致大量 I/O),或者_filelength(fileno(filepointer));
(不清楚这是否会导致大量 I/O)stat(filename, &st); st.st_size;
(不清楚这是否会导致任何I/O)