如何递归地将整个目录复制并粘贴到新路径?

How to copy and paste a whole directory to a new path recursively?

我想将目录作为 copy/paste 例程移动,但要保持其结构不变。我不只是在寻找目录中所有子文件夹中的文件,然后 copy/paste 它们(作为 this 解决方案),而是我想 clone 整个事情和保持其结构不变(树 -> 子文件夹和文件),就像复制和粘贴例程一样。

所以我找到了 this 函数,可以将一个充满文件的文件夹复制到一个新路径:

Folder -> File(s)

该函数的行为与 copy/paste 例程相同。它需要 SourcePath、DestinationPath 和布尔值到 OverWriteExisting。不错,很小,但太糟糕了,它没有被标记为该问题的实际答案(推荐一个比率)。

但是如果我想移动整个目录怎么办?换句话说,如果我有一个文件夹,里面有文件夹的文件夹,文件夹的文件夹等等?也许不知道这样的文件结构树大小:

Folder -> Folder(s) -> ... -> Folder(s) -> File(s)

我正在使用以下例程 copy/paste 一个包含文件夹的文件夹。但在这里我知道我只有一层文件夹,所以只需要一个 foreach 循环:

foreach (var Folder in DestinationFolder) // here I know that I have only one level of folders to reach the files
{
    CopyDirectory(FolderPath, DestinationPath, false); // use that function to copy the files
}

以上函数服务于这个目录结构:

Folder -> Folder(s) -> File(s)

我试过 this 但它没有达到我想要的效果。我只在搜索所有子文件夹时检索所有文件。这不是我想要的。我想保留子文件夹和原始结构。在这里,我得到四个文件,而不是按原样构造的目录、子文件夹及其子文件夹、子文件夹、文件。只有四个,因为它删除了我不希望发生的重复项,因为我需要所有这些。

这是我当前的结构(但我的问题对任何目录都是全局的):

Folder -> Folders -> Folders + Files

以下代码在新路径中的作用如下:

NewFolder -> AllFilesFoundInAnySubfolder

dialog.FileName = dialog.FileName.Replace(".xml", ""); // get the destination path
DirectoryInfo dirInfo = new DirectoryInfo(dialog.FileName);

if (dirInfo.Exists == false)
    Directory.CreateDirectory(dialog.FileName);

List<String> EverythingInTheDirectory = Directory
                    .GetFiles(FileStructure.baseSessionPath + "\" + SelectedSession.Name, "*.*", SearchOption.AllDirectories).ToList(); // source

foreach (string file in EverythingInTheDirectory)
{
    FileInfo mFile = new FileInfo(file);
    // to remove name collusion
    if (new FileInfo(dirInfo + "\" + mFile.Name).Exists == false)
        mFile.MoveTo(dirInfo + "\" + mFile.Name);
}

如何移动整个未知大小的目录并保持其结构不变?不仅从目录中获取文件并移动它们!

这是一个将递归地将一个目录克隆到另一个目标目录的示例。以后在当前问题中加入你尝试过的内容,将会得到更好的回答

class Program
{
    static void Main(string[] args)
    {
        CloneDirectory(@"C:\SomeRoot", @"C:\SomeOtherRoot");
    }

    private static void CloneDirectory(string root, string dest)
    {
        foreach (var directory in Directory.GetDirectories(root))
        {
            string dirName = Path.GetFileName(directory);
            if (!Directory.Exists(Path.Combine(dest, dirName)))
            {
                Directory.CreateDirectory(Path.Combine(dest, dirName));
            }
            CloneDirectory(directory, Path.Combine(dest, dirName));
        }

        foreach (var file in Directory.GetFiles(root))
        {
            File.Copy(file, Path.Combine(dest, Path.GetFileName(file)));
        }
    }
}