C# 创建根目录为的树视图
我在寻找解决一个简单问题的方法,并找到了这个递归解决方案: 这很好,但它假设您有一个固定的起始根,然后在其下构建文件结构的其余部分 我试图想出一个算法,除了没有第一个硬编码的根外,基本上做相同的事情。例如,我有以下文件C# 创建根目录为的树视图,c#,algorithm,C#,Algorithm,我在寻找解决一个简单问题的方法,并找到了这个递归解决方案: 这很好,但它假设您有一个固定的起始根,然后在其下构建文件结构的其余部分 我试图想出一个算法,除了没有第一个硬编码的根外,基本上做相同的事情。例如,我有以下文件 Data/test.txt Data/dir/results.txt Another/image.jpg file.dat 将导致以下树 Data test.txt dir results.txt Another image.txt file.da
Data/test.txt
Data/dir/results.txt
Another/image.jpg
file.dat
将导致以下树
Data
test.txt
dir
results.txt
Another
image.txt
file.dat
所以它几乎和另一个解决方案一样,只是我去掉了上根,然后把所有的东西都推回去。但我想你真的不可能那么容易做到(是吗?那样会很方便)
这是我想到的算法
- 首先,像往常一样分割路径
- 定义一个新方法,该方法将检查treeview是否包含键等于路径第一部分的节点(因为我们的根是目录)
- 如果存在,则返回该节点。否则,创建节点并返回它
- 现在,将节点和其他路径部分传递到另一个方法中,该方法将把在步骤3中找到的节点视为根节点,然后从那里开始
听起来应该行得通。不太清楚第二步,因为如果文件在存储位置以根目录形式存在会怎样?写下了所描述的算法。似乎工作如预期。不过,对于路径中没有目录的文件,我不太确定 有人看到问题吗
// start by getting the root
private void build_file_list(List<Entry> entries)
{
TreeNode root;
string[] pathbits;
for (int i = 0; i < entries.Count(); i++)
{
pathbits = entries[i].name.Split(Path.DirectorySeparatorChar);
root = get_root(pathbits[0]);
add_path(root, pathbits);
}
}
// returns existing node or creates a new one as needed
private TreeNode get_root(string key)
{
if (explorer_view.Nodes.ContainsKey(key))
return explorer_view.Nodes[key];
else
return explorer_view.Nodes.Add(key, key);
}
// now we have our root so we can start building the rest
private void add_path(TreeNode node, string[] pathbits)
{
for (int i = 1; i < pathbits.Count(); i++)
node = add_node(node, pathbits[i]);
}
// just recursively build nodes until end of file path
private TreeNode add_node(TreeNode node, string key)
{
if (node.Nodes.ContainsKey(key))
return node.Nodes[key];
else
return node.Nodes.Add(key, key);
}
//从获取根开始
私有无效生成文件列表(列表条目)
{
树根;
字符串[]路径位;
对于(int i=0;i