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

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

限制:

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

在linux上,打开两个文件,并使用fstat检查st_ino (edit :)和st_dev是否相同。 open将遵循符号链接。 不要直接使用stat ,以防止竞争条件。

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

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

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

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

在bash中,您只需调用:

 stat -c %i filename 

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

 stat -c %N filename 

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

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