Во-первых, я проверил этот пост , но, во-первых, он находится в Python, а во-вторых, создается впечатление, что он фактически создает каталоги, что я не могу сделать в этом сценарии.
Второйэто не каталоги, которые существуют, и я не могу их создать.
У меня есть вход в C #, например:
List<string> filePaths = new List<string>();
filePaths.Add(@"ProgramDir\InstallDir\Module1\mod1pack1.exe");
filePaths.Add(@"ProgramDir\InstallDir\Module1\mod1pack2.exe");
filePaths.Add(@"ProgramDir\InstallDir\Module2\mod2pack1.exe");
filePaths.Add(@"ProgramDir\InstallDir\Module1\SubModule1\report1.rpt");
filePaths.Add(@"SystemDir\DependencyDir\dependency1.dll");
filePaths.Add(@"SystemDir\DependencyDir\dependency2.dll");
Я пытался создать объект, которыйпредставляет эту структуру, такую, что ее можно визуализировать следующим образом:
-ProgramDir
Installdir
Module1
mod1pack1.exe
mod1pack2.exe
-SubModule1
report1.rpt
Module2
mod2pack1.exe
-SystemDir
-DependencyDir
dependency1.dll
dependency2.dll
Я пробовал разные версии следующего, и я мог бы действительно использовать некоторую помощь, чтобы выяснить, где я ошибся.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SetFilePathList();
DTree forest = new DTree();
List<DTreeBranch> branches = new List<DTreeBranch>();
foreach (string path in filePaths)
{
forest.GrowTree(path.Split('\\'), branches);
}
forest.SubBranches.AddRange(branches);
}
private static List<string> filePaths { get; set; }
private static void SetFilePathList()
{
filePaths = new List<string>();
filePaths.Add(@"ProgramDir\InstallDir\Module1\mod1pack1.exe");
filePaths.Add(@"ProgramDir\InstallDir\Module1\mod1pack2.exe");
filePaths.Add(@"ProgramDir\InstallDir\Module2\mod2pack1.exe");
filePaths.Add(@"ProgramDir\InstallDir\Module1\SubModule1\report1.rpt");
filePaths.Add(@"SystemDir\DependencyDir\dependency1.dll");
filePaths.Add(@"SystemDir\DependencyDir\dependency2.dll");
}
}
public class DTree
{
public List<DTreeBranch> SubBranches { get; set; }
public string BranchName { get; set; }
public DTree() { SubBranches = new List<DTreeBranch>(); }
public DTreeBranch AddChildren(string[] childElements, DTreeBranch branch)
{
DTreeBranch childBranch;
foreach (string element in childElements)
{
childBranch = new DTreeBranch();
childBranch.BranchName = element;
branch.SubBranches.Add(childBranch);
var query = from q in childElements
where q != childBranch.BranchName
select q;
AddChildren(query.ToArray<string>(), childBranch);
}
return branch;
}
public void GrowTree(string[] pathElements, List<DTreeBranch> Branches)
{
DTreeBranch result = Branches.Find(delegate(DTreeBranch b)
{
return b.BranchName == pathElements[0];
});
if (result == null)
{
DTreeBranch newRootBranch = new DTreeBranch();
newRootBranch.BranchName = pathElements[0];
Branches.Add(newRootBranch);
GrowTree(pathElements, Branches);
}
else
{
var query = from q in pathElements
where q != result.BranchName
select q;
DTreeBranch childBranch = AddChildren(query.ToArray<string>(), result);
Branches.Add(childBranch);
}
}
}
public class DTreeBranch
{
public List<DTreeBranch> SubBranches { get; set; }
public string BranchName { get; set; }
public DTreeBranch()
{
SubBranches = new List<DTreeBranch>();
}
}
}
Главное, чтобы на выходе было всего два слоя.Я предполагаю, что я говорю, что новые элементы добавляются в глубину, а не в широту, и я не знаю, как эффективно справиться с этим.Я также думаю, что у меня больше кода, чем мне нужно.
Заранее спасибо.