关于c#:复制目录中的所有文件


Copy all files in directory

如何将一个目录中的所有内容复制到另一个目录,而不在每个文件上循环?


你不能。DirectoryDirectoryInfo都不能提供Copy方法。你需要自己来实现这一点。

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);
}

你不能,但是你可以使用一些简洁的代码,比如Directory.GetFiles(mydir).ToList().ForEach(f => File.Copy(f, otherdir +"\\" f);


接吻——保持简单愚蠢……对于任何情况,包括编程,都是一个很好的经验法则。

这里是在保持原始层次结构的同时复制所有文件、文件夹、子文件夹及其所有文件和文件夹的最简单方法。它还显示一个不错的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);
            }
        }
    }
}

作为外部命令执行xcopy source_directory\*.* destination_directory。当然,这只适用于Windows计算机。


1
2
3
Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + @"resources\html")
    .ToList()
    .ForEach(f => File.Copy(f, folder +"\" + f.Substring(f.LastIndexOf("\"))));