10

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

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

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

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

4

3 回答 3

8

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

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

于 2008-10-21T16:32:04.340 回答
1

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

于 2008-10-21T16:24:20.003 回答
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)似乎是一种快速且非常简单的方法。

于 2008-10-21T17:30:09.623 回答