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

Kha*_*laf -1 c# directory copy-paste file

我希望将目录作为复制/粘贴例程移动,方法是保持其结构不变.我不是只查找目录中所有子文件夹中的文件然后复制/粘贴它们(作为解决方案),而是我想克隆整个事物并保持其结构(树 - >子文件夹和文件),确切地说像复制和粘贴例程.

所以我发现这个函数将一个装满文件的文件夹复制到一个新路径:

文件夹 - >文件

该函数的行为与复制/粘贴例程相同.它将SourcePath,DestinationPath和boolean值作为OverWriteExisting.很好,很小但是太糟糕了,没有标记为那个问题的实际答案(推荐费率).

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

文件夹 - >文件夹 - > ... - >文件夹 - >文件

我使用以下例程来复制/粘贴具有文件夹的文件夹.但在这里我知道我只有一个级别的文件夹,因此只需要一个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
}
Run Code Online (Sandbox Code Playgroud)

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

文件夹 - >文件夹 - >文件

我试过这个并没有做我想做的事.我只检索所有文件,同时搜索所有子文件夹.这不是我想要的.我想保留子文件夹和原始结构.在这里,我得到四个文件,而不是原样构建的目录,子文件夹及其子文件夹,子文件夹,文件.只有四个,因为它删除了重复,我不希望这发生,因为我需要所有这些.

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

文件夹 - >文件夹 - >文件夹+文件

以下代码在新路径中执行的操作如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

bhm*_*ler 8

下面是一个示例,它将递归地将目录克隆到另一个目标目录.将来,将您尝试过的内容添加到当前问题中可以获得更好的响应

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)));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在 `Directory.CreateDirectory` 之前不需要 `Directory.Exists`,因为如果目录已经存在,`Directory.CreateDirectory` 是无操作的。 (3认同)
  • 这就是我正在寻找的。这正是我想要的。它将文件夹复制并粘贴到新路径。谢谢 ! (2认同)