2013-11-28 61 views
0

我正在嘗試使用熔絲實現內存中文件系統。重命名函數接受'from'和'to'參數。在熔絲文件系統中實現重命名

當我試圖在bash中這樣做, MV文件1文件2, 它在內部調用更名功能(我用-d選項檢查)。

當我嘗試在GUI中重命名該函數時,它再次調用重命名函數。

但是,如果file2是已經存在的文件,則mv命令覆蓋它,而GUI禁止我重命名該文件。我該如何執行這個約束,因爲這兩個操作在內部都沒有區別地調用重命名函數。

+0

爲什麼你認爲'mv'的行爲對於你的文件系統來說比任何其他文件系統都不同? –

+2

Afaik獲得該行爲的唯一方法是在調用'rename'之前檢查文件是否作爲單獨的操作存在。我猜你所描述的GUI是這樣做的。 –

+0

我不認爲MV是不同的。我擔心的是,當我做mv file1 file2時,如果file2已經存在,它將被覆蓋。如果我對gui重新命名,它會阻止我。當我的代碼在內部調用重命名函數時,如何處理它。 – Torpedo

回答

1

rename函數用原子替換目標文件並刪除舊名稱。這是它的全部要點,如果它沒有做到這一點,那麼各種事情就會崩潰。對於想要防止重命名在另一個文件之上的應用程序,他們必須先使用link函數(如果目標存在,將會失敗),然後在link成功時使用舊名稱unlink

+0

或者,甚至更簡單,GUI可能只是檢查其他文件名是否正在使用並顯示錯誤(如果是)。這不是原子,當然,但在GUI文件管理器中這不太可能是重要的。 – duskwuff

+0

@duskwuff:的確,我懷疑這是大多數破壞的GUI軟件的工作方式......但這並不意味着我們應該寬恕它。實際上,如果您在一個窗口中進行大量複製/移動操作,並且磁盤顛簸/交換不良,並且在另一個窗口中以交互方式重命名文件,這可能很重要。 –

+1

雖然你不能總是使用'link()'。並不是所有的文件系統都支持硬鏈接(例如FAT),有些(如HFS +)可能需要做很多額外的工作來處理鏈接/取消鏈接。 – duskwuff