You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法正确捕获文件路径:TreeView节点filepath字段赋值修正

问题

我用以下代码按"/"拆分文件路径生成TreeView列表,但拆分时每个节点的filepath字段被赋值为完整路径,而非节点对应的实际路径,该怎么修改?

当前生成的节点(错误示例):

/download/b/a
Loop-1;SubItem = new Treeview()
{
    name = download
    Level = 2,
    filepath = /download/b/a,
    SubItems = new List<Treeview>()
};

Loop-2;subItem = new Treeview()
{
    name = b,
    Level = 2,
    filepath = /download/b/a,
    SubItems = new List<Treeview>()
};

期望修改后的节点(正确示例):

Loop-1;subItem = new Treeview()
{
    name = download Level = 2,
    filepath = /download,
    SubItems = new List<Treeview>()
};

Loop-2;subItem = new Treeview()
{
    name = b,
    Level = 2,
    filepath = /download/b,
    SubItems = new List<Treeview>()
};

现有代码:

private void FilePath(System.Windows.Controls.TreeView treeView, IEnumerable<string> paths, char pathSeparator)
{
    List<Treeview> sourceCollection = new List<Treeview>();
    foreach (string path in paths)
    {
        string[] fileItems = path.Split(pathSeparator);
        if (fileItems.Any())
        {
            Treeview root = sourceCollection.FirstOrDefault(x => x.Name.Equals(fileItems[0]) && x.Level.Equals(1));
            if (root == null)
            {
                root = new Treeview()
                {
                    Level = 1,
                    Name = fileItems[0],
                    filepath = path,
                    SubItems = new List<Treeview>()
                };
                sourceCollection.Add(root);
            } // if

            if (fileItems.Length > 1)
            {
                Treeview parentItem = root;
                int level = 2;
                for (int i = 1; i < fileItems.Length; ++i)
                {
                    Treeview subItem = parentItem.SubItems.FirstOrDefault(x => x.Name.Equals(fileItems[i]) && x.Level.Equals(level));
                    if (subItem == null)
                    {   
                        subItem = new Treeview()
                        {
                            Name = fileItems[i],
                            Level = level,
                            filepath = path,
                            SubItems = new List<Treeview>
                        };
                              parentItem.SubItems.Add(subItem);
                    } // if

                    parentItem = subItem;
                    level++;
                } // for
            } // if
        } // if
    } // foreach
    TreeView.ItemsSource = sourceCollection;
} // void
解决方案

核心思路是:不再直接将完整路径赋值给filepath,而是根据当前节点的层级,拼接出从根节点到当前节点的专属路径。

修改后的完整代码

private void FilePath(System.Windows.Controls.TreeView treeView, IEnumerable<string> paths, char pathSeparator)
{
    List<Treeview> sourceCollection = new List<Treeview>();
    foreach (string path in paths)
    {
        string[] fileItems = path.Split(pathSeparator);
        if (fileItems.Any())
        {
            // 处理根节点
            Treeview root = sourceCollection.FirstOrDefault(x => x.Name.Equals(fileItems[0]) && x.Level.Equals(1));
            if (root == null)
            {
                // 拼接根节点自身的路径
                string rootPath = pathSeparator + fileItems[0];
                root = new Treeview()
                {
                    Level = 1,
                    Name = fileItems[0],
                    filepath = rootPath,
                    SubItems = new List<Treeview>()
                };
                sourceCollection.Add(root);
            } 

            if (fileItems.Length > 1)
            {
                Treeview parentItem = root;
                int level = 2;
                // 维护当前已拼接的路径,从根节点路径开始
                string currentPath = parentItem.filepath;
                for (int i = 1; i < fileItems.Length; ++i)
                {
                    Treeview subItem = parentItem.SubItems.FirstOrDefault(x => x.Name.Equals(fileItems[i]) && x.Level.Equals(level));
                    if (subItem == null)
                    {   
                        // 拼接当前节点的路径
                        currentPath = string.Concat(currentPath, pathSeparator, fileItems[i]);
                        subItem = new Treeview()
                        {
                            Name = fileItems[i],
                            Level = level,
                            filepath = currentPath,
                            SubItems = new List<Treeview>()
                        };
                        parentItem.SubItems.Add(subItem);
                    }
                    else
                    {
                        // 节点已存在时,复用其路径作为后续拼接的基础
                        currentPath = subItem.filepath;
                    }

                    parentItem = subItem;
                    level++;
                } 
            } 
        } 
    } 
    treeView.ItemsSource = sourceCollection;
} 

关键修改点

  1. 根节点路径重构:创建根节点时,不再使用完整路径,而是拼接出根节点自身的专属路径(如/download)。
  2. 子节点路径动态拼接:循环处理子节点时,维护currentPath变量,每次迭代拼接当前节点名称,生成对应路径赋值给filepath。
  3. 已存在节点的路径复用:如果子节点已存在,直接使用该节点的filepath作为后续拼接的基础,避免路径重复拼接错误。

内容的提问来源于stack exchange,提问作者herakless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:40:37