你能判斷文件是否已被重新命名嗎?

你能判斷文件是否已被重新命名嗎?

許多用於同步檔案的工具不太適合同步您的主目錄。因此,為了學習 Ruby,我一直在開發自己的同步工具。

我遇到的一個問題(我認為是在我的同步工具中)是當使用者重新命名檔案或刪除檔案時發生的情況。想想第一種情況(如果使用者重命名它)有沒有一種方法可以讓我知道這不是一個新檔案而是一個已重新命名的檔案?也許是我不知道的文件的唯一 ID。文件描述符聽起來像是需要研究的東西,但我很確定這是一個不同的概念。

答案1

無法確定檔案是否已重新命名。

當一個檔案被重新命名時,它的索引節點號碼不變。 (對於「外來」檔案系統(例如網路檔案系統)來說可能並非如此,但對於所有「本機」Unix 檔案系統來說卻是這樣。)但是反之則不然:如果刪除文件,則可能會建立一個新檔案相同的索引節點號。因此,即使您看到一個檔案與另一個檔案之前具有相同的索引節點號,也不一定表示該檔案已重新命名。

索引節點號碼唯一識別文件當它存在時。這使得它適合檢測硬鏈接,但不適用於檢測重命名。

文件描述符與特定進程相關聯,在這裡沒有用處。

您可以考慮一個啟發式的方法:如果一個檔案的大小、修改時間和索引節點號碼與以前相同,但名稱不同,則表示它已重新命名。這種啟發式方法類似於許多同步工具可偵測未更改檔案的方法:相同的名稱、大小和修改時間。

我能想到的所有追蹤文件重命名的工具都是根據文件的內容來完成的。齊奏檢測重命名的文件如果至少有一個端點是遠端的。一些現代版本控制系統(例如 git)也會偵測重新命名的檔案。

我強烈懷疑無論你想對文件同步做什麼,同步,齊奏和版本控制,它已經存在。

答案2

文件描述符是在程式開啟文件時建立的,並且僅在程式再次關閉文件之前有效。正如您所懷疑的那樣:一個不同的概念。

如果檔案剛剛重命名,索引節點不會更改,您可以使用它,但除非經常發生重命名,否則我懷疑它是否值得。

相關內容