Получить древовидную структуру каталога с его подпапками и файлами, используя C#.net в приложении Windows
У меня есть каталог '0'(скажем) и подпапки и файлы, как показано ниже
0-
0.1
0.1.1
A.rdb
B.xml
0.1.2
A.rdb
B.xml
0.2
0.2.1
A.rdb
B.xml
0.1.2
A.rdb
B.xml
Вот код, который я использую для этого ниже,
List<string> folders = new List<string>();
DirectoryInfo di = new DirectoryInfo(textBox1.Text);
IEnumerable<string> IEstring;
IEstring = from subdirectory in di.GetDirectories()
where subdirectory.GetFiles("*.*", SearchOption.AllDirectories).Length > 0
select subdirectory.Name;
folders = IEstring.ToList();
List<String> files = DirSearch(textBox1.Text);
textBox2.Text = textBox2.Text+ displayMembers(files);
Проблема в том, что я не могу напечатать этот список с именем "файлы", я не знаю, где я делаю не так здесь.
Мне также нужно было распечатать результаты папок и файлов в новой электронной таблице Excel. Результат шоу будет таким же, как этот
0-
0.1
0.1.1
A.rdb
B.xml
0.1.2
A.rdb
B.xml
0.2
0.2.1
A.rdb
B.xml
0.1.2
A.rdb
B.xml
Но в таблице.
2 ответа
Способ 1
HierarchicalItem
содержит необходимую нам информацию о предмете в папке. Элемент может быть папкой или файлом.
class HierarchicalItem
{
public string Name;
public int Deepth;
public HierarchicalItem(string name, int deepth)
{
this.Name = name;
this.Deepth = deepth;
}
}
SearchDirectory
рекурсивная функция для преобразования и выравнивания древовидной структуры в список
static IEnumerable<HierarchicalItem> SearchDirectory(DirectoryInfo directory, int deep = 0)
{
yield return new HierarchicalItem(directory.Name, deep);
foreach (var subdirectory in directory.GetDirectories())
foreach (var item in SearchDirectory(directory, deep + 1))
yield return item;
foreach (var file in directory.GetFiles())
yield return new HierarchicalItem(file.Name, deep + 1);
}
Пример:
//fake TextBox...
var textBox1 = new { Text = @"D:\Code\C#" };
var directory = new DirectoryInfo(textBox1.Text);
var items = SearchDirectory(directory);
//you can print it to a console
foreach (var item in items)
Console.WriteLine(string.Concat(Enumerable.Repeat('\t', item.Deepth)) + item.Name);
//or a textbox
textBox1.Text = string.Join("\n", items.Select(i =>
string.Concat(Enumerable.Repeat('\t', i.Deepth)) + i.Name));
//or a table
for (int i = 0; i < items.Count(); i++)
{
//with row = i, and column = items[i].Deepth + 1
}
Способ 2
Этот рекурсивный метод печатает каталог, как команда дерева в CommandLine
static string ScanFolder(DirectoryInfo directory, string indentation = "\t", int maxLevel = -1, int deep = 0)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine(string.Concat(Enumerable.Repeat(indentation, deep)) + directory.Name);
if (maxLevel == -1 || maxLevel < deep)
{
foreach (var subdirectory in directory.GetDirectories())
builder.Append(ScanFolder(subdirectory, indentation, maxLevel, deep + 1));
}
foreach (var file in directory.GetFiles())
builder.AppendLine(string.Concat(Enumerable.Repeat(indentation, deep + 1)) + file.Name);
return builder.ToString();
}
Это приближает тебя?
Func<DirectoryInfo, int, IEnumerable<string>> fetch = null;
fetch =
(di, l) =>
new [] { "".PadLeft(l * 4) + di.Name }
.Concat(di.GetDirectories().SelectMany(di2 => fetch(di2, l + 1)))
.Concat(di.GetFiles().Select(
fi => "".PadLeft((l + 1) * 4) + fi.Name));
Обратите внимание, что null
назначение необходимо как это Func
является рекурсивным
Вы бы назвали это так:
var results =
fetch(new DirectoryInfo(@"C:\Top Folder"), 0)
.ToList();