【问题标题】:Detecting file deletion after fopenfopen 后检测文件删除
【发布时间】:2010-10-21 15:16:02
【问题描述】:

我正在使用检测文件(日志文件)中更改的代码,然后在 fseek 和 ftell 的帮助下处理更改。但是如果文件被删除和更改(使用 logrotate),程序会停止但不会死亡,因为它不会检测到更多更改(即使文件被重新创建)。 fseek 不显示错误和eiter ftell。 我怎样才能检测到该文件删除?也许是一种用其他 FILE *var 重新打开文件并比较文件描述符的方法。但我怎么能做到这一点。 ?

【问题讨论】:

  • 像 if(!filemember) 这样的东西不适合你吗?
  • 文件打开一次,然后用 fseek(fp,0,FSEEK_END); 等待其长度的变化;但是当文件被删除时,这永远不会改变。

标签: c fopen


【解决方案1】:

当文件被删除时,它不一定会从您的磁盘中删除。在您的情况下,程序仍然具有旧文件的句柄。旧文件句柄不会为您提供有关其删除或替换为另一个文件的任何信息。

检测文件删除和重新创建的一种简单方法是使用 stat(2) 和 fstat(2)。他们给你一个 struct stat ,其中包含文件的 inode。当一个文件被重新创建(并且仍然打开)时,文件(旧的打开和重新创建)是不同的,因此 inode 是不同的。 inode 字段是 st_ino。是的,除非您希望使用诸如 inotify 之类的 Linux 功能,否则您需要对此进行轮询。

【讨论】:

  • 所以,当第一次打开文件时,我需要做一个统计并在每次迭代中进行更改,如果 inode 不同,请与其他统计检查,如果它们不同,则文件被移动/更改和做点什么……
【解决方案2】:

您可以定期关闭文件并再次打开它,这样您将打开新创建的文件。当文件没有句柄时文件实际上会被删除(打开的文件描述符是句柄),您仍然持有旧文件。

【讨论】:

  • 我不能这样做,因为我不断检查文件的大小并不断在预览最后一个字符和新的最后一个字符之间跳转(并处理更改)
【解决方案3】:

在 Windows 上,您可以对 FS 的修改设置回调。以下是详细信息:http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

【讨论】:

  • 不错。我忘了说,这个程序是在 posix 系统中运行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2015-02-06
相关资源
最近更新 更多