簡體   English   中英

FileInfo.move 與 RoboCopy /MOV 速度:效率

[英]FileInfo.move vs RoboCopy /MOV speed:efficiency

這個問題部分來自好奇的角度,但也來自實際的角度。

我正在構建的應用程序需要將文件從計算機復制到 USB 並返回。 為此,我們使用 robocopy,並且不打算改變它。

但在執行復制操作之前,我們會創建內容備份。 例如:

  • 將 E:\ 的內容備份到 E:\USB_Backup
  • 從 C:\SomeFolder 復制到 E:\

或者

  • 備份 C:\Destination 到 C:\Destination\USB_Backup
  • 從 E:\ 復制到 C:\Destination,忽略“USB_Backup”文件夾。

文件的復制將使用 robocopy 完成。 但我擔心的是為這個問題將文件移動到備份中。 Robocopy 似乎復制了所有文件,然后刪除了源。 同時 windows 資源管理器拖放要快得多,因為它只是更新文件的路徑。

在那種情況下,驅動器號保持不變,只是文件夾路徑發生了變化,使用 FileInfo.move() 的循環會更快嗎?

好的,我終於有時間在這里為將來可能有類似問題的任何人執行和報告我的測試結果。

如果速度更快,則在頂層執行循環。

USB2.0驅動用於測試來源:D:\MoveSource
目的地:D:\MoveDest
194MB 文件 -> 2,696 個文件,87 個文件夾

使用 RoboSharp 執行移動操作:

RoboSharp.RoboCommand rc = new RoboCommand(MoveSource, MoveDest, true);
rc.CopyOptions.MoveFilesAndDirectories = true;
rc.CopyOptions.MultiThreadedCopiesCount = 1;
rc.CopyOptions.CopySubdirectoriesIncludingEmpty = true;
rc.Start().Wait();

//Command: D:\Source D:\Dest "*.*" /COPY:DAT /DCOPY:DA /E /MOVE /MT:1 /R:0 /W:30 /V  /BYTES 
// Results: Directories: 88, Files: 2696, Bytes: 204282757, Speed: 1852148 Bytes/sec

總運行時間:225,215 毫秒(僅執行 1 次運行,因為我知道使用此方法在我的應用程序中此操作平均需要幾分鍾,因此結果在預期范圍內)

這是我的頂級移動代碼(不深入文件夾結構、比較或過濾文件或記錄任何內容的代碼)

var dirs = Directory.GetDirectories(MoveSource);
var files = Directory.GetFiles(MoveSource);
string dest;
int i = 0;
long msTotal = 0;
while (i < 20)
{
    var SW = StopWatchStart();
    Directory.CreateDirectory(MoveDest);
    foreach (var d in files)
    {
        dest = Path.Combine(MoveDest, Path.GetFileName(d));
        Directory.Move(d, dest);
    }
    foreach (var d in dirs)
    {
        var D = new DirectoryInfo(d);
        dest = Path.Combine(MoveDest, D.Name);
        D.MoveTo(dest);
    }
    Directory.Delete(MoveSource, true);
    SW.Stop();
    msTotal += SW.ElapsedMilliseconds;
    int tries = 0;
    while (Directory.Exists(MoveDest) && tries < 30)
    {
        try
        {
            tries++;
            Task.Delay(350).Wait();
            Directory.Move(MoveDest, MoveSource);
        }
        catch { }
        }
    i++;
}

平均時間(20 次運行平均):973 毫秒

使用遞歸循環以與 RoboCopy 相同的方式挖掘文件夾結構(如果需要,它可以用於過濾/記錄/等)的平均經過時間為 38,499 毫秒(20 次運行平均值),即仍然比 RoboCopy 在同一測試中執行的速度快 5 倍(假設我沒有記錄文件大小或生成任何結果數據)(我以平均值運行此測試,因為與 RoboCopy 相比,運行 3 次后速度相當快,但仍然有輕微的波動,我認為這將是一件好事)。

所以結果是:

  • RoboSharp (RoboCopy) -> 225,215ms
  • 深入研究結構並使用FileInfo.MoveTo() -> 38,499 毫秒(平均 20 次運行)的遞歸例程
  • 循環遍歷頂級文件夾的目錄和文件的Directory.Move() -> 973 毫秒(平均 20 次運行)

現在因為使用的是 USB2.0 設備,所以我可能會在將其真正實施到我的應用程序之前通過網絡驅動器重新運行此測試。 但是手動執行循環比 robocopy 快得多,但是您必須添加 robocopy 可以測試的所有場景,這會增加處理時間。 由於我的應用程序是用於備份目的的簡單批量移動,因此遞歸循環會快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM