2015-10-13 61 views
2

我們有一個應用程序將文件存儲在臨時位置,直到用戶決定完成其事務。臨時目錄對於每個事務都是唯一的。一旦完成,文件將從臨時位置移動到最終位置,這對每個事務也是唯一的。這一切都沒有任何問題。.NET Directory.Move()vs File.Move()

我很吃驚,但谷歌搜索時,因此,我們無法找到上的任何話題被普遍認爲是最佳做法:

  1. 呼叫System.IO.Directory.Move(SRC, des)只需一次移動整個目錄,或者
  2. 調用System.IO.File.Move(src,des)一次移動一個文件。

由於這些決策通常依賴於多種因素,我應該注意以下幾點條件:

  1. 的源和目標目錄將永遠是在同一臺機器上,但應用程序使得呼叫將在同一網絡上的另一臺機器上。我相信應用程序服務器和文件服務器在同一臺物理機器上是不同的虛擬機,但我並不積極。
  2. 文件數可能在1到10之間,或更多。我自己並沒有監控生產系統,所以我不確定文件的平均數量或計數的傳播方式。
+0

源和目標位於同一個卷/分區上嗎? – vcsjones

+0

是的。廣義目錄結構是 \ temp \ \ final \ 。 – Eric

+0

我只是說建立一個小的測試環境,並使用'Directory.Move()'比較'File.Move()'來記錄速度。做很多次,並以更快的速度進行。 – sab669

回答

0

我認爲最大的問題不是速度,而是:移動錯誤會發生什麼?

我打算在LukeH的答案中使用這些信息,而不是在這裏重複。

對於目錄移動,MoveFile的行爲應適合移動單個文件失敗。如果您使用每個文件移動,那麼您必須以適當的方式自己處理錯誤條件。這需要仔細考慮。

注意的MoveFile的文檔指定:

一個需要注意的是,MoveFile功能將在目錄移動時的目的地是不同的捲上失敗。

這可能是也可能不是您的問題,也可能是使用每個文件移動的原因。 Directory.Move文檔明確提到了這一點(並且Directory.Move的參考源明確檢查具有相同根的源和目的地)。

2

我不確定是否有任何固定的「最佳實踐」,而不是您應該使用最合適的工具進行工作。

由於你正在做的是將整個目錄從其臨時位置/狀態移動到永久位置/狀態我建議使用Directory.Move。這意味着你的代碼將更明顯地反映你的邏輯意圖。


如果你更關心的兩種方法之間的差異的技術...

在.NET中的Microsoft版本,兩者Directory.MoveFile.Move最終調出了Win32 MoveFileMoveFileEx功能。您可以通過查看參考源證實了這一點:

考慮到這一點,它似乎有可能呼叫MoveFile一次(通過Directory.Move)通常比每次交易多次呼叫(通過File.Move)更可取。