如何检查两个文件名是否指向同一物理文件

时间:2010-01-11 13:31:48

标签: c

我有一个程序接受两个文件名作为参数:它读取第一个文件以创建第二个文件。如何确保程序不会覆盖第一个文件?

限制:

  • 当文件系统支持(软或硬)链接时,该方法必须继续工作
  • 文件权限已修复,只需要第一个文件可读,第二个文件可写
  • 最好是平台中立的(尽管Linux是主要目标)

6 个答案:

答案 0 :(得分:12)

在Linux上,打开这两个文件,然后使用fstat检查st_ino(编辑:)和st_dev是否相同。 open将遵循符号链接。不要直接使用stat来防止竞争条件。

答案 1 :(得分:9)

最好的办法是不要将文件名用作身份。相反,当您打开文件进行读取时,请使用操作系统支持的任何机制将其锁定。然后当你打开文件进行写入时,也要锁定它 - 如果锁定失败,则报告错误。

答案 2 :(得分:3)

如果可能,在LINUX中打开第一个只读文件(O_RDONLY)。然后,如果您尝试再次打开它以写入它,您将收到错误。

答案 3 :(得分:0)

您可以使用stat获取文件状态,并检查inode编号是否相同。

答案 4 :(得分:0)

如果你的意思是相同的 inode,在 bash 中,你可以这样做

[ FILE1 -ef FILE2 ] && echo equal || echo difference

结合 realpath/readlink,这也应该处理软链接。

答案 5 :(得分:-1)

也许你可以使用system()函数来调用一些shell命令?

在bash中,您只需致电:

stat -c %i filename

显示文件的inode编号。您可以通过这种方式比较两个文件,如果它们的inode相同,则表示它们是硬链接。以下电话:

stat -c %N filename

将显示文件的名称,如果它是符号链接,它也会打印它链接到的文件名。它只打印出一个名称,即使它指向的文件有硬链接,因此检查符号链接需要比较第二个文件的索引节点号和符号链接链接到的文件,以确保。

您可以将stat输出重定向到文本文件,然后解析程序中的文件。