2008-10-03 48 views
54

在POSIX系統上,rename(2)提供了原子重命名操作,包括覆蓋目標文件(如果存在並且權限允許)。在Windows上可以重寫原子文件(使用覆蓋)嗎?

有沒有什麼辦法讓Windows上的相同的語義?我知道Vista和Server 2008上的MoveFileTransacted(),但我需要這個來支持Win2k。

這裏的關鍵詞是原子 ...解決方案不得以任何方式失敗,導致操作處於不一致的狀態。

我見過很多人說這是不可能在Win32,但我問你,是不是真的?

請儘可能提供可靠的引用文獻。

+0

@Adam戴維斯 - 如果你有閱讀器程序的控制,以及作家,就可以解決這個問題是這樣的。 Reader會執行io.Directory(「FileDone _ *。dat」)並選擇最高的#代替*。 Write創建名爲「FileWriting.dat」的文件,並將其重命名爲「FileDone_002.dat」..003,004等。這不僅解決了非原子刪除/重命名的問題,而且僅重命名爲原子,如果舊文件保持打開狀態,則仍然可以更新。如果每次操作都不重新打開,讀卡器可以基於計時器觀察新文件。讀者可以清理舊文件。 – FastAl 2012-05-14 20:03:58

回答

15

Win32不保證原子文件元數據操作。我會提供一個引文,但沒有 - 這個事實沒有書面或文件記載的保證意味着多少。

你將不得不編寫自己的程序來支持這一點。這很不幸,但是你不能指望win32提供這種服務級別 - 它根本不是爲它設計的。

+4

我覺得這很難相信。這意味着即使我們正在處理可靠的系統(如NTFS),停電也很容易破壞文件系統。 – mafu 2012-03-19 10:26:36

+1

@mafutrct請記住,這個問題不是關於破壞文件系統 - 而是關於確保重命名成功完成或根本不會發生。文件系統不會被損壞,但文件名不能保留在原始或最終狀態。 NTFS是一個日誌文件系統,因此它不會(很容易)被破壞,但取決於文件重命名或操作順序的複雜性,它可能不會保留在原始或期望的最終狀態。 – 2012-03-19 20:58:10

8

你仍然有Windows上的重命名()調用,雖然我想象的保證你想不知道你使用的文件系統不能進行 - 沒有保證,如果你正在使用FAT的實例。

但是,您可以使用MoveFileEx並使用MOVEFILE_REPLACE_EXISTING 和MOVEFILE_WRITE_THROUGH選項。後者在MSDN這樣的描述:

設置這個值保證了一個 行動之前 函數返回一個副本執行和刪除 操作刷新到磁盤。在複製操作結束時發生沖洗 。

我知道這並不一定相同,重命名操作,但我認爲這可能是你會得到最好的保證 - 如果它是一個文件的舉動,它應該更簡單的重命名。

+5

據我所知,如果目標存在並且在數據複製步驟中發生I/O錯誤,則此「原始」目標丟失,因此MoveFileEx不是您的要求的原子。這就是爲什麼MoveFileTransacted稍後添加的原因。 – 2008-10-03 18:25:10

+3

MoveFileEx應該很好。它有一個名爲MOVEFILE_COPY_ALLOWED的標誌,它表示:「如果文件要移動到不同的卷,該功能通過使用CopyFile和DeleteFile函數來模擬移動。」所以只是不要通過這個標誌,你應該有一些相當於POSIX重命名的東西,是的? – andrewrk 2014-11-17 17:29:53

+0

如果在Windows下已存在新文件,重命名將失敗。拋開原子性,windows版本甚至在語義上與Unix版本不兼容。 – wcochran 2017-11-30 21:05:00

13

在Windows Vista和Windows Server 2008的一個原子移動功能已經被添加 - MoveFileTransacted()

不幸的是,這並不與舊版本的Windows幫助。

Interesting article here on MSDN

1

「從MS研究論文有關段落: 「在......」

這是暗示,該操作是原子,但它是一種誤導,只適用於製造混亂。我們需要的是原子刪除舊文件和一個不可分割的一步新文件的重命名。這可能有兩種元數據操作中ITSE如果是原子的,但化合物不是原子的。

2

一個公平的數字答案,但不是我期待......我的理解(也許不正確地)認爲MoveFile 可能是原子前提是正確的星星排列,使用標誌和文件系統是與目標源相同。否則,操作將回退到[複製 - >刪除]文件。

鑑於此,我還了解到MoveFile - 當它是原子 - 只是設置文件信息,這也可以在這裏完成:setfileinfobyhandle

這並不能掩蓋替換的情況下,雖然

相關問題