有效复制多个文件

时间:2008-10-21 16:15:31

标签: c# .net file copy

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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)。