2012-03-19 16 views
3

http://code.google.com/p/guava-libraries/issues/detail?id=365討論了遞歸刪除目錄時可能出現的潛在競爭條件。在Windows下以無競爭的方式刪除一個目錄?

根據http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7148952這可以在Linux下使用openat()以無競爭的方式實現。 Windows下是否有等效的機制?

+0

http://en.wikipedia.org/wiki/Transactional_NTFS可能會有所幫助。 – 2012-03-19 02:21:30

+0

Boost是否會導致比賽? – Mikhail 2012-03-19 02:32:30

+0

@ ta.speot.is:請發表正式答案,以便我可以對其進行更詳細的評論。 – Gili 2012-03-19 02:40:20

回答

0

Windows文件系統行爲和linux文件系統行爲之間的一個主要區別是鎖定和引用計數。

在Windows中,如果某個進程打開了一個文件,則該文件通向該文件的路徑將受到保護。因此,如果某人打開了「C:\ a \ b \ c \ d \ file.txt」,則不允許任何人重命名或刪除路徑的任何部分「C:\ a \ b \ c \ d \ file.txt的」。

linux模式有很大的不同,該路徑的任何部分都可以更改,甚至可以刪除該文件。把句柄保存到「file.txt」的過程仍然有一個引用,並且在所有句柄關閉之前,文件不會從文件系統中刪除。

Win32 API沒有公開直接的方法來保存目錄的句柄(儘管這裏有API--請參閱「Zw」函數,FindFirstFile可能我不確定,備份API等) - 但你的進程「當前目錄」確實擁有該目錄的句柄。

因此,您可以通過更改工作目錄然後直接打開文件來獲得「openat」行爲。更好的辦法是使用類似ZwCreateFile()的方式打開目錄的句柄 - 因爲「當前目錄」是全局過程。

搜索Stackoverflow和Microsoft.com的ZwCreateFile信息。

+0

聽起來很有希望。謝謝! – Gili 2014-02-11 04:40:37