我无法理解如何在我的treeView1中识别节点是文件还是目录?

时间:2014-12-21 14:16:17

标签: c# .net winforms

这就是我将节点添加到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服务器获取的。

TreeView1

例如,如果我点击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;

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

3 个答案:

答案 0 :(得分:1)

标签是可以的,因为默认情况下它是未使用的prpoerty,它实际上是一个属性,不会被滥用。类型是对象。所以它需要一切。但是你必须小心谨慎地把东西放进去并正确地找回它。

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

答案 1 :(得分:1)

这是我的解决方案:

首先将root保存为完整目录(直接在名称或后台的某些字符串中) 第二,点击某个节点后,获取其全名node.FullPath 这样你就得到一个字符串,它是这个节点所代表的完整路径(文件目录) 现在正如 Scott Nimrod 所有已经检查过它是使用文件还是目录

!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 :(得分:0)

File.Exists和Directory.Exists