【问题标题】:I can't understand how to identify in my treeView1 if a node is a file or a directory?我不明白如何在我的 treeView1 中识别节点是文件还是目录?
【发布时间】:2014-12-21 23:28:32
【问题描述】:

这就是我将节点添加到 TreeNode 的方式:

private int total_dirs;
        private int searched_until_now_dirs;
        private int max_percentage;
        private TreeNode directories_real_time;
        private string SummaryText;

        private TreeNode CreateDirectoryNode(string path, string name , int recursive_levl )
        {
            var directoryNode = new TreeNode(name);
            var directoryListing = GetDirectoryListing(path);

            var directories = directoryListing.Where(d => d.IsDirectory);
            var files = directoryListing.Where(d => !d.IsDirectory);

            total_dirs += directories.Count<FTPListDetail>();
            searched_until_now_dirs++;

            int percentage;

            foreach (var dir in directories)
            {
                directoryNode.Nodes.Add(CreateDirectoryNode(dir.FullPath, dir.Name, recursive_levl+1));

                if (recursive_levl == 1)
                {
                    TreeNode temp_tn = (TreeNode)directoryNode.Clone();

                    this.BeginInvoke(new MethodInvoker( delegate
                    {
                        UpdateList(temp_tn);
                    }));
                }


                percentage = (searched_until_now_dirs * 100) / total_dirs;
                if (percentage > max_percentage)
                {
                    SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
                    max_percentage = percentage;
                    backgroundWorker1.ReportProgress(percentage, SummaryText);
                }
            }

            percentage = (searched_until_now_dirs * 100) / total_dirs;
            if (percentage > max_percentage)
            {
                SummaryText = String.Format("Searched dirs {0} / Total dirs {1}", searched_until_now_dirs, total_dirs);
                max_percentage = percentage;
                backgroundWorker1.ReportProgress(percentage, SummaryText);
            }

            foreach (var file in files)
            {
                directoryNode.Nodes.Add(new TreeNode(file.Name));
                numberOfFiles.Add(file.FullPath);
            }           

            return directoryNode;
        }

然后我正在更新treeView1:

DateTime last_update;

        private void UpdateList(TreeNode tn_rt)
        {
            TimeSpan ts = DateTime.Now - last_update;
            if (ts.TotalMilliseconds > 200)
            {
                treeView1.BeginUpdate();
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(tn_rt);
                TreeViewXmlPopulation.SerializeTreeView(treeView1, @"c:\XmlFile\Test.xml");
                ExpandToLevel(treeView1.Nodes, 1);
                treeView1.EndUpdate();
            }

        }

最后,当我在 treeView1 中看到目录和文件结构时,我想知道当我用鼠标选择项目时,它是目录还是文件。

treeView1 中的目录和文件我是从我的 ftp 服务器获取的。

例如,如果我点击 A,我想知道我选择了一个目录,如果我点击 install.exe,我想知道它是一个文件。

这就是我在 treeView1 中选择项目的方式:

private void treeView1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);

                if (treeView1.SelectedNode != null)
                {
                    menuStrip.Show(treeView1, e.Location);
                }
            }
        }

我有一个带有选项的上下文菜单条:

private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            if (e.ClickedItem.Text == "Delete")
            {
                Delete(treeView1.SelectedNode.FullPath);
            }
        }

在 FullPath 中,它可以只是单个文件或目录名,里面有或没有文件。 我怎么知道它是文件还是目录?在 Delete 方法中,我想决定如果它是一个文件该怎么做,然后删除一个文件,如果它是一个目录,然后做其他事情。

我想使用 Tag 属性,但不知道如何使用它。我试图在 CreateDirectoryNode 中添加这个:

directoryNode.Tag = directoryNode.Nodes;

但我不确定这是否是正确的方法以及以后如何使用标签来识别它是文件还是目录。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    这是我的解决方案:

    首先将根目录保存为完整目录(直接在名称中或后台的某个字符串中) 第二,一旦你点击一个节点,得到它的全名node.FullPath 这样你会得到一个字符串,它是这个节点代表的完整路径(文件目录) 现在作为 Scott Nimrod 已经准备好使用 sed 检查它是文件还是目录

    !System.IO.Directory.Exists(node.FullPath) //==> yep this is a file
    

    看看这个例子(从我的项目中递归迭代并创建一棵树)

    这个例子将遍历并寻找特殊的扩展

            public TreeNode RecursiveDirToTree(TreeNode parentNode, string path,
                                     string extension = ".txt")
        {
            var result = new TreeNode(parentNode == null ? path/*base line*/ : System.IO.Path.GetFileName(path));
            foreach (string dir in System.IO.Directory.GetDirectories(path))
            {
                TreeNode node = RecursiveDirToTree(result, dir , extension);
                if (node.Nodes.Count > 0)
                {
                    result.Nodes.Add(node);
                }
            }
            foreach (string file in System.IO.Directory.GetFiles(path))
            {
                if (System.IO.Path.GetExtension(file).ToLower() == extension.ToLower())
                {
                    result.Nodes.Add(System.IO.Path.GetFileName(file));
                }
            }
            return result;
        }
    

    【讨论】:

      【解决方案2】:

      标签没问题,因为它默认是未使用的属性,而且它确实是一个属性,不会被滥用。类型是对象。所以它需要一切。但是您必须小心自己将东西放入其中并正确取回。

      最好的方法是在标签内保存一个列表,它由两列组成,类型和引用。 但是对于您的情况,只需将节点放入标记中,然后通过适当的转换将它们检索到本地对象中。 顺便说一句,您可能还想按需加载子目录,以检查它是文件还是目录。 这可以优化性能。

      【讨论】:

        【解决方案3】:

        File.Exists 和 Directory.Exists

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 2020-07-18
          • 2010-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多