如何在打开后检测到您打开的文件已被移动

时间:2012-01-16 19:29:05

标签: c++ linux file inode

正如标题所述:

  • 我的程序会打开一个文件。
  • 出现了一些东西并移动了该文件。 Inode应该是相同的,但名称是不同的。
  • 关闭文件,然后删除,但它不再存在

那么如何检测它已被移动并删除正确的文件名?

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用inotify检测旧名称的更改(查找IN_MOVE_SELF事件)。但如果您的真正目标只是删除文件的名称,则可以在打开文件后立即执行此操作(使用unlink(2))。 Unix文件语义将允许您继续使用打开的文件,并且在关闭句柄之前,实际上不会删除磁盘上的数据。然后没有人能够重命名该文件。

答案 1 :(得分:0)

在关闭之前尝试access(2)文件。如果您获得ENOENT,则文件已被移动。按照/ proc / self / fd / $ open_file_number / symlink使用readlink(2)查找新文件名。

答案 2 :(得分:0)

fstat打开文件,stat名称,并比较结果。

但是,与任何可能的检查一样,它仍然是活泼的;在您做出任何检查之后但在您采取行动之前,该名称可能会改变其含义。是时候重新审视你的要求了。