【问题标题】:Create replica of a folder structure创建文件夹结构的副本
【发布时间】:2018-08-06 11:50:18
【问题描述】:

我有几个文件夹,如下结构: c:\temp\project\folder1\folder2 (这个目录是动态的,我的意思是可以有更多或更少的文件夹)

我想创建这个结构的影子,在每个目录中添加 2 个文件夹,例如

C:\temp\projectNew\folder1(在folder1下我想再创建2个文件夹,存档文件夹,未处理)\folder2(在folder2下我想再创建2个文件夹,存档文件夹,未处理)

这是我的尝试

var sourcePath = @"C:\\temp\\project";
var parentDirectorty = Directory.GetParent(folderPath);

var sourceDirectoryName = folderPath.Replace(Path.GetDirectoryName(folderPath) + Path.DirectorySeparatorChar, "");
var firstDestiDirectoryName = Directory.CreateDirectory($@"{parentDirectorty}\{sourceDirectoryName}new");

但不知道如何获取其他文件夹名称并在每个目录中创建 Archive 和 NotProcessed 文件夹。

对不起我糟糕的英语。

【问题讨论】:

  • 好吧,您需要获取主文件夹下的文件夹,然后搜索这些文件夹以获取更多文件夹等并构建树,直到您到达它的底部。由于您不知道需要使用递归的结构的深度。我认为 .NET 框架中已经有一些方法和类可以帮助您解决这个问题,我现在没有时间查找具体内容,但我相信您可以根据需要搜索它。如果您不了解该技术,还可以研究递归。
  • 所以,用不同的方式表达你的问题;你有一个“根”文件夹,在本例中是它的项目。在该文件夹中,有文件夹,在每个文件夹及其所有子文件夹中,您要创建更多文件夹吗?
  • 你做对了@WynDiesel
  • 对不起@WynDiesel 我误解了你的解释。我想创建另一个目录。像项目一样让新目录命名为 projectNew 并在该 projectNew 文件夹下创建所有子目录

标签: c# directory


【解决方案1】:

使用GetDirectories获取给定路径的所有目录和子目录路径。

接下来,对于每个路径,将您的文件夹添加到其中。

public void XXXX(string path)
{
    string[] directories = Directory.GetDirectories(path, "*", SearchOption.AllDirectories);

    directories.ForEach(x=> AddNewFolders(x));
}

public void AddNewFolders(string path)
{
      var archivedFoldeer = Path.Combine(path,"Archive");
      if (!Directory.Exists(archivedFoldeer )      
           Directory.CreateDirectory(archivedFoldeer );
      //var notProcesssedFoldeer = Path.Combine(path,"NotProcessed");
}

【讨论】:

  • 要么我理解这个问题是错误的,要么这不是正确的答案——它意味着是一个卷影副本,因此:c:\temp\project\ 应该被复制到 c:\temp\projectNEW\ .这个答案将它获得的每条路径与“存档”结合起来。这意味着它不会在“项目”之外创建字典,而是在其中创建“存档”目录
  • @MaKiPL,我同意。 OP的问题不清楚。他们提到了“副本”,但从示例来看,它似乎不是副本,而只是在子目录中创建新文件夹,除非根文件夹中存在这两个文件夹?
  • @MaKiPL 我从我的角度理解这个问题。也许我错了。让 OP 决定:)
  • @MaKiPL 你是对的,在这种情况下我想创建一个新目录我的父目录是项目,我想创建另一个文件夹并将其命名为 projectNew 并创建项目文件夹具有的所有子目录并创建另外 2 个文件夹
【解决方案2】:

将所有可用目录转储到字符串数组:

string[] directories = Directory.GetDirectories("C:\\temp\\project", "*", SearchOption.AllDirectories);

然后循环它:

for(int i = 0; i<directories.Length; i++)
{
    string newPath = directories[i].Replace("C:\\temp\\project\\", "C:\\temp\\projectNEW\\");
    Directory.CreateDirectory(newPath);
}

幸运的是 Directory.CreateDirectory 会自动为您处理一切

【讨论】:

  • 我没有投反对票,但 AFAIK SearchOption.AllDirectories 只查找直接子目录,而不是一直递归到树下?至少这就是msdn.microsoft.com/en-us/library/ms143448(v=vs.110).aspx 所暗示的
  • @ADyson 刚刚测试过,它创建了最多 6 个目录的树(.NET 4.5.2)
  • 很高兴知道,谢谢。在这种情况下,您的代码看起来很整洁,所以请点赞。
  • @MaKiPL 效果很好。我已经用 8 个目录对其进行了测试。非常感谢你。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多