复制目录中的所有文件

时间:2011-08-22 10:21:37

标签: c#

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

9 个答案:

答案 0 :(得分:94)

你做不到。 DirectoryDirectoryInfo都不提供Copy方法。你需要自己实现它。

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

请阅读评论,以了解这种简单方法的一些问题。

答案 1 :(得分:17)

Msdn就此提供了指导 - How to:Copy Directories

答案 2 :(得分:10)

您可以使用VB的FileSystem.CopyDirectory方法来简化任务:

using Microsoft.VisualBasic.FileIO;

foo(){
    FileSystem.CopyDirectory(directoryPath, tempPath);
}

答案 3 :(得分:3)

public class Calculate extends Thread {
    public Calculate(){}

    @Override
    public void run() {
              synchronized(this){  
                  try {
                        Thread.sleep(10000);
                        System.out.println("not supposed to be shown");
                    } catch(InterruptedException ex) {
                         Thread.currentThread().interrupt();
                    }                   
                notify();
            }   
    }    
}

答案 4 :(得分:1)

你做不到。但您可以使用某种简洁的代码,例如Directory.GetFiles(mydir).ToList().ForEach(f => File.Copy(f, otherdir + "\\" f);

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这很棒!它将复制子目录,或者您可以将所有子目录中的所有文件转储到一个位置。

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

答案 7 :(得分:0)

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

这是在保留原始层次结构的同时复制所有文件,文件夹,子文件夹及其所有文件和文件夹的最简单方法。它还显示一个不错的Microsoft Windows进度对话框。 只需遵循以下基本说明:

1:在Visual Studio中打开一个新的C#控制台应用程序 - 版本(无论如何)

2:从菜单栏中;转到“工具 - Nuget包管理器 - 管理解决方案的Nuget包”在Nuget包管理器搜索框中,键入 - “Microsoft.VisualBasic”并选择“.Net”包。

3:返回“Program.cs”页面,添加以下“using”语句:

使用系统;

使用Microsoft.VisualBasic.FileIO;

4:在“Main”方法内,键入下面提供的代码,用您的文件夹/驱动器替换源路径和目标路径。

5:“Console.WriteLine”行只显示正在复制的消息并显示“请待机”。这行代码完全是可选的。此过程不需要工作。

6:“FileSystem.CopyDirectory”命令是将文件夹和内容复制到新目标的基本复制功能。唯一真正的区别是“UIOption.AllDialgs”命令被添加到复制命令的末尾。这是生成Microsoft Windows进度对话框的部分。

现在,将以下代码添加到C#“Program.cs”页面。

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

答案 8 :(得分:-1)

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