【问题标题】:Effective copying multiple files有效复制多个文件
【发布时间】:2010-09-18 08:36:45
【问题描述】:

我必须将大量文件从一个文件夹复制到另一个文件夹。目前我正在这样做:

string[] files = Directory.GetFiles(rootFolder, "*.xml");
foreach (string file in files)
{
    string otherFile = Path.Combine(otherFolder, Path.GetFileName(file));
    File.Copy(file, otherFile);
}

这是最有效的方法吗?似乎需要很长时间。

编辑:我真的在问是否有更快的方法来进行批量复制,而不是复制单个文件,但我想答案是否定的。

【问题讨论】:

    标签: c# .net file copy


    【解决方案1】:

    我最近在 VB .NET 中使用文件流实现了我的文件副本:

    fsSource = New FileStream(backupPath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None, 1024, FileOptions.WriteThrough)
    fsDest = New FileStream(restorationPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, 1024, FileOptions.WriteThrough)
    TransferData(fsSource, fsDest, 1048576)
    
        Private Sub TransferData(ByVal FromStream As IO.Stream, ByVal ToStream As IO.Stream, ByVal BufferSize As Integer)
            Dim buffer(BufferSize - 1) As Byte
    
            Do While IsCancelled = False 'Do While True
                Dim bytesRead As Integer = FromStream.Read(buffer, 0, buffer.Length)
                If bytesRead = 0 Then Exit Do
                ToStream.Write(buffer, 0, bytesRead)
                sizeCopied += bytesRead
            Loop
        End Sub
    

    更新进度条(使用 sizeCopied)并在需要时取消文件传输(使用 IsCancelled)似乎是一种快速且非常简单的方法。

    【讨论】:

      【解决方案2】:

      我想不出比 File.Copy 更有效的方法,它直接进入操作系统。

      另一方面,如果需要这么长时间,我强烈建议显示一个进度对话框 - 就像 SHFileOperation 为你做的那样。至少您的用户会知道发生了什么。

      【讨论】:

      • 你不知道吗,当你添加一个进度条时,事情实际上变得更快了。至少,这是用户会告诉你的。
      【解决方案3】:

      您可以使用操作系统来移动文件。这就是 WinMerge 之类的工具所做的。您单击应用程序中的“复制”按钮,它会弹出 Windows 进度框,就像您使用资源管理器排列副本一样。 This thread 描述了它。

      【讨论】:

        猜你喜欢
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 2016-10-15
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        相关资源
        最近更新 更多