【问题标题】:How to copy and paste a whole directory to a new path recursively?如何以递归方式将整个目录复制并粘贴到新路径?
【发布时间】:2016-07-28 19:07:34
【问题描述】:

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

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

文件夹 -> 文件

该函数的行为称为复制/粘贴例程。它将 SourcePath、DestinationPath 和布尔值用于 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
}

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

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

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

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

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

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

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

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

【问题讨论】:

  • clone 在这种情况下是什么意思?它与将目录递归复制到另一个位置有何不同?另外,请粘贴一些代码。你试过什么?
  • 您的链接问题有两个重新投票。请耐心等待,并留出时间重新打开它,而不是发布该帖子的实际副本。这不是一个即时满足网站;您不会立即得到答案,如果您一次又一次地发布它也无济于事。
  • 人们确实去那里。有一个审核队列,这就是您获得两次重新投票的方式。而你告诉 Zuxlx 查看“问题,你会看到我尝试过*的事实表明你已经知道这是重复的。(为了澄清一些事情,复制/粘贴 是用户在 Windows 资源管理器中执行的操作。编程解决方案不会复制/粘贴;代码会创建目录并复制文件。)
  • 复制问题以链接到原始问题是不正确的行为。您应该做的是编辑原始问题以改进它,这会使它回到问题列表的顶部,引起人们的注意,并很快重新打开它。 (这正是help center 所说的你应该做的事情。)现在你应该做的是编辑这个问题以包含你其他问题的代码和详细信息,然后删除其他问题消除混乱。

标签: c# file directory copy-paste


【解决方案1】:

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

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

【讨论】:

  • 这就是我要找的。这正是我想要的。它将文件夹复制并粘贴到新路径。谢谢!
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2019-09-18
相关资源
最近更新 更多