Я работаю над простым переносимым приложением с одной формой, в котором *.exe и папка с именем UserGeneratedContent находятся в одном каталоге. В моей форме у меня есть древовидное представление, которое я хочу заполнить узлами, соответствующими всем подпапкам (если они существуют) UserGeneratedContent. Код, который я вставил ниже, работает почти так, как я этого хочу, но он заполняет древовидную структуру UserGeneratedContent в качестве корневого узла и, в свою очередь, обрабатывает найденные подпапки как дочерние узлы и т. д.
string folder = @"UserGeneratedContent";
FolderHierachy.Nodes.Add(GetDirectoryNodes(folder));
private static TreeNode GetDirectoryNodes(string path)
{
var node = new TreeNode(Path.GetFileName(path));
var subDirs = Directory.GetDirectories(path).Select(d => GetDirectoryNodes(d)).ToArray();
node.Nodes.AddRange(subDirs);
return node;
}
На этом этапе я перепробовал почти все комбинации @"UserGeneratedContent", которые только мог придумать, - добавление обратной косой черты и т. д. в попытке получить доступ к подпапкам, но мне не повезло. Я знаю, что это, вероятно, что-то простое, но я застрял - каков правильный синтаксис, чтобы гарантировать, что приведенный выше метод просматривает UserGeneratedContent для получения подпапок?
Кроме того, я хочу, чтобы элемент управления древовидной структуры позволял пользователю создавать, переименовывать и удалять папки в любой иерархии по своему выбору, поэтому мне интересно, что будет считаться передовым опытом в этом отношении?
Правка\Обновление №1 - 2.12.2012:
После гораздо большего количества проб и ошибок я отказался от приведенного выше кода - что бы я ни пытался, по какой-то причине я не смог заставить его работать. К счастью, приведенный ниже код отлично работает для меня :-)
DirectoryInfo dirInfo = new DirectoryInfo(@"UserGeneratedContent");
DirectoryInfo[] subDirs = dirInfo.GetDirectories();
string pathToSubFolders = Path.Combine(@"UserGeneratedContent", subDirs[0].ToString());
PopulateTreeView(treeView1, pathToSubFolders);
private void PopulateTreeView(TreeView treeView, string path)
{
treeView.Nodes.Clear();
var rootDirectoryInfo = new DirectoryInfo(path);
treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
}
private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
var directoryNode = new TreeNode(directoryInfo.Name);
foreach(var directory in directoryInfo.GetDirectories())
{
directoryNode.Nodes.Add(CreateDirectoryNode(directory));
}
return directory;
}
Мне нужно добавить к нему некоторый код обработки ошибок, чтобы в @"UserGeneratedContent" не было подпапок - так как subDirs[0].ToString()
выдает исключение IndexOutOfRangeException, если подпапки не существуют, и я не совсем уверен, как это сделать. так что буду признателен за подсказки.
Правка\Обновление №2 - 2.12.2012:
Для проверки ошибок я использовал блок try-catch, как показано ниже:
try
{
string pathToSubFolders = Path.Combine(dirInfo.ToString(), subDirs[0].ToString());
PopulateTreeView(treeView1, pathToSubFolders);
}
catch (IndexOutOfRangeException)
{
//Do Something Here
}
Приведенный выше код работает, но может ли кто-нибудь сказать мне, правильно ли я поступил?
Спасибо за чтение.