繁体   English   中英

C# 中有没有一种方法可以将多个文件/文件夹作为一个任务复制?

[英]Is there a method in C# to copy multiple files/folders as one task?

我正在使用 do.net 6-windows。

我想一次复制大量文件/文件夹。

像下面这样的方法的问题在于它是

  1. 与使用 Windows 文件资源管理器复制相比,大量文件的速度明显较慢。 我通过复制 ca 来测试它。 500 张图像。 下面的代码需要一分多钟,而文件浏览器只需几秒钟即可完成。
  2. 不像文件资源管理器那样显示所有文件的进度条
foreach (string filePath in paths)
{
     FileSystem.CopyFile(filePath, destination, UIOption.AllDialogs);
}

问题是它将一个复制任务一个接一个地移交给操作系统,而不是对所有文件执行一项任务。

是否有任何库或内置方法可以实现此目的(类似于FileSystem.CopyMultipleFiles(arrayOfPaths, destination, UIOption.AllDialogs) ?或者我必须使用本机 windows API,如果是这样,哪个?

据我了解你的问题,你想并行复制文件。 您可以使用完美的多线程抽象 — class System.Threading.Tasks.Parallel Static 方法Parallel.ForEach接受一个集合,接受一个Action<TCollectionElement>并为集合中的每个项目运行操作,将项目传递给它。 所有操作(如果没有太多)并行运行。 未指定顺序,但在您的情况下这不是问题。

这是您的案例的示例:

using System.Threading.Tasks;

// ...

Parallel.ForEach(paths, p => {
  FileSystem.CopyFile(p, destination, UIOption.AllDialogs);
});

顺便说一句,如果每个动作根据的进度增加你的进度条的值,并且每个动作都认为它只能填充进度条中的固定区域(总和),那么效果就像进度条代表进度一样整体工作。 固定区域应为整个条形的1/x ,其中x是您的文件数。

是的,在 C# 中,您可以使用 System.IO 命名空间将多个文件和文件夹作为一项任务进行复制。 实现此目的的一种方法是使用 Directory.GetFiles() 方法获取目录中的文件列表,然后使用 File.Copy() 方法将每个文件复制到不同的位置。 同样,您可以使用 Directory.GetDirectories() 方法获取子目录列表,然后使用 Directory.CreateDirectory() 方法在新位置创建这些子目录。 您还可以使用 File.Move() 方法移动文件和文件夹。 您可以使用循环遍历文件和文件夹并将它们一一复制。 以下是在一个任务中复制多个文件和文件夹的示例:

string sourcePath = @"C:\example\source";
string targetPath = @"C:\example\target";

// Copy all files from source to target
foreach (string file in Directory.GetFiles(sourcePath))
{
    string targetFile = Path.Combine(targetPath, Path.GetFileName(file));
    File.Copy(file, targetFile, true);
}

// Copy all subdirectories from source to target
foreach (string dir in Directory.GetDirectories(sourcePath))
{
    string targetDir = Path.Combine(targetPath, Path.GetFileName(dir));
    Directory.CreateDirectory(targetDir);
    CopyAll(dir, targetDir);
}

此示例使用辅助方法 CopyAll() 以递归方式将所有文件和文件夹从源复制到目标。 您还可以使用 Microsoft 的 System.IO.Compression 命名空间对 Zip 和 Unzip 文件和文件夹进行压缩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM