簡體   English   中英

如何檢查兩個文件名是否指向同一個物理文件

[英]How to check whether two file names point to the same physical file

我有一個接受兩個文件名作為參數的程序:它讀取第一個文件以創建第二個文件。 如何確保程序不會覆蓋第一個文件?

限制:

  • 當文件系統支持(軟或硬)鏈接時,該方法必須繼續工作
  • 文件權限固定,只要求第一個文件可讀,第二個文件可寫
  • 它最好是平台中立的(盡管 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

將顯示文件名,如果它是一個符號鏈接,它也會打印它鏈接到的文件名。 它只打印出一個名稱,即使它指向的文件有硬鏈接,因此檢查符號鏈接需要比較第二個文件的 inode 編號和符號鏈接鏈接到的文件,以確保。

您可以將 stat 輸出重定向到文本文件,然后在程序中解析該文件。

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

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

結合realpath / readlink ,它也應該處理軟鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM