[英]How to check whether two file names point to the same physical file
我有一個接受兩個文件名作為參數的程序:它讀取第一個文件以創建第二個文件。 如何確保程序不會覆蓋第一個文件?
限制:
在 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.