2015-05-03 36 views
4

在閱讀了此stackoverflow post關於如何「重命名」文件的解決方案後,結果證明使用Files.Move或Directory.Move方法。C#File.Move vs Rename - 它實際移動文件還是重命名?

我知道在Windows中,如果我做了重新命名它是瞬時的,因爲我認爲它沒有那麼大的驅動器上移動文件,因爲它是對一些索引改變位置的某處。

當我使用Files.Move或Directory.Move是要做同樣的事情,還是要做一個複製,然後刪除?

我試圖避免磨損和撕裂我的驅動器。

回答

1

在.NET Framework的Windows實現中,System.IO.File.Move調用底層的Win32函數MoveFile

MSDN約MoveFile:

移動現有的文件或目錄,包括它的孩子。

它似乎是Windows資源管理器調用的相同函數。所以是的,它做同樣的事情,只是重命名,而不是複製/刪除。

public static void Move(String sourceFileName, String destFileName) { 
    ... 
    ... 
    if (!Win32Native.MoveFile(fullSourceFileName, fullDestFileName)) 
    { 
     __Error.WinIOError(); 
    } 
} 
3

當我使用Files.Move或Directory.Move是打算做同樣的事情

從技術上講,它不會做任何文件。它將調用底層操作系統來執行移動操作。

所以從這個意義上說,是的,它會做同樣的事情。當您指示Windows資源管理器「移動」文件時,就像您總結的那樣,實際上只是在某處重新索引某個文件。 (該部分由操作系統使用的文件系統處理。)當您在.NET代碼中執行這些功能時,在框架的更深層次上,它們本質上調用與Windows資源管理器相同的操作系統級操作。

,或者它會做一個複製,然後一個刪除

我不認爲我見過它以這種方式進行移動操作的文件系統。 (可能缺少某個新手或學生作爲學術項目編寫的書。)如果確實存在,那麼它很可能不會被您可能遇到的任何操作系統共同使用。

基本軟件(無論是Windows資源管理器或在.NET Framework代碼)通知到執行操作的操作系統。操作系統通知文件系統執行操作。文件系統本身應該是非常適合這樣做。

4

請參考由File.Move使用基礎Win32 API的文檔:

MoveFile功能將移動(重命名)是一個文件或目錄 (包括兒童),無論是在同一目錄或 目錄。有一點需要注意的是MoveFile功能在 目錄移動到不同的捲上時會失敗。如果 文件跨卷移動,則MoveFile不會將安全性 描述符與文件一起移動。該文件將在目標目錄中分配默認的 安全描述符。 MoveFile 函數使用鏈接跟蹤服務協調其操作,因此 鏈接源可以在移動時跟蹤。

關於你的問題:

難道要做一個副本,然後刪除?

只有當您將文件移動到不同的磁盤上時,纔會執行「複製」和「刪除」操作。