Copy all files in directory
如何将一个目录中的所有内容复制到另一个目录,而不在每个文件上循环?
你不能。
1 2 3 4 5 6 7 8 9 10 | void Copy(string sourceDir, string targetDir) { Directory.CreateDirectory(targetDir); foreach(var file in Directory.GetFiles(sourceDir)) File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file))); foreach(var directory in Directory.GetDirectories(sourceDir)) Copy(directory, Path.Combine(targetDir, Path.GetFileName(directory))); } |
请阅读评论,了解这种简单方法的一些问题。
msdn对此提供了指导-如何:复制目录
可以使用vb的filesystem.copydirectory方法简化任务:
1 2 3 4 5 | using Microsoft.VisualBasic.FileIO; foo(){ FileSystem.CopyDirectory(directoryPath, tempPath); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using System.IO; string sourcePath = @"D:\test"; string targetPath = @"D:\test_new"; if (!Directory.Exists(targetPath)) { Directory.CreateDirectory(targetPath); } foreach (var srcPath in Directory.GetFiles(sourcePath)) { //Copy the file from sourcepath and place into mentioned target path, //Overwrite the file if same file is exist in target path File.Copy(srcPath, srcPath.Replace(sourcePath, targetPath), true); } |
你不能,但是你可以使用一些简洁的代码,比如
接吻——保持简单愚蠢……对于任何情况,包括编程,都是一个很好的经验法则。
这里是在保持原始层次结构的同时复制所有文件、文件夹、子文件夹及其所有文件和文件夹的最简单方法。它还显示一个不错的Microsoft Windows进度对话框。只需遵循以下基本说明:
1:在Visual Studio版本(无论什么版本)中打开一个新的C控制台应用程序
2:从菜单栏;转到Nuget Package Manager搜索框中的"工具-Nuget Package Manager-管理Nuget Packages for Solution",键入–"microsoft.visualBasic"并选择".net"包。
3:回到"program.cs"页面,添加以下"using"语句:
?使用系统;
?使用Microsoft.VisualBasic.FileIO;
4:在"main"方法中,键入下面提供的代码,用文件夹/驱动器替换源路径和目标路径。
5:"console.writeline"行只显示正在复制的消息,并显示到"请稍候"。这行代码完全是可选的。此过程不需要工作。
6:"filesystem.copydirectory"命令是将文件夹和内容复制到新目标的基本复制功能。唯一的区别是"uioption.alldials"命令被添加到copy命令的末尾。这是生成"Microsoft Windows进度"对话框的部分。
现在,将以下代码添加到您的C"program.cs"页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using System; using Microsoft.VisualBasic.FileIO; namespace ProgressDialogBox { class Program { static void Main(string[] args) { string sourcePath = @"c:\TestA\TestNew3"; string destinationPath = @"c:\TestB\TestNew4"; Console.WriteLine(@"Copying... {0} ... Please stand by", sourcePath); FileSystem.CopyDirectory(sourcePath, destinationPath, UIOption.AllDialogs); } } } |
整个过程的创建时间不到3分钟。事实上,阅读这篇文章要比创建和执行程序花费更长的时间。
享受。
希望这对将来的人有所帮助。
以下是我用于参考的来自Microsoft的链接:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-provide-a-progress-dialog-box-for-file-operations
这很管用!它将复制子目录,或者您只需将所有子目录中的所有文件转储到一个位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /// AUTHOR : Norm Petroff /// <summary> /// Takes the files from the PathFrom and copies them to the PathTo. /// </summary> /// <param name="pathFrom"></param> /// <param name="pathTo"></param> /// <param name="filesOnly">Copies all files from each directory to the"PathTo" and removes directory.</param> static void CopyFiles(String pathFrom, String pathTo, Boolean filesOnly) { foreach(String file in Directory.GetFiles(pathFrom)) { // Copy the current file to the new path. File.Copy(file, Path.Combine(pathTo, Path.GetFileName(file)), true); // Get all the directories in the current path. foreach (String directory in Directory.GetDirectories(pathFrom)) { // If files only is true then recursively get all the files. They will be all put in the original"PathTo" location // without the directories they were in. if (filesOnly) { // Get the files from the current directory in the loop. CopyFiles(directory, pathTo, filesOnly); } else { // Create a new path for the current directory in the new location. var newDirectory = Path.Combine(pathTo, new DirectoryInfo(directory).Name); // Copy the directory over to the new path location if it does not already exist. if (!Directory.Exists(newDirectory)) { Directory.CreateDirectory(newDirectory); } // Call this routine again with the new path. CopyFiles(directory, newDirectory, filesOnly); } } } } |
作为外部命令执行
1 2 3 | Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + @"resources\html") .ToList() .ForEach(f => File.Copy(f, folder +"\" + f.Substring(f.LastIndexOf("\")))); |