【问题标题】:How to display all files under folders in treeview [closed]如何在树视图中显示文件夹下的所有文件
【发布时间】:2016-02-02 17:05:41
【问题描述】:

我正在尝试使用 winforms 在树视图控件中获取所有驱动器、文件夹、子文件夹和文件。我看过下面的文章。

http://codehill.com/2013/06/list-drives-and-folders-in-a-treeview-using-c/

但这仅显示驱动器、文件夹和子文件夹,而不显示这些文件夹中包含的文件。

请任何人帮助和指导我如何在树视图中查看这些文件夹下的所有这些文件,在此先感谢。

编辑:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GetDrives
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

            //get a list of the drives
            string[] drives = Environment.GetLogicalDrives();

            foreach (string drive in drives)
            {
                DriveInfo di = new DriveInfo(drive);
                int driveImage;

                switch (di.DriveType)    //set the drive's icon
                {
                    case DriveType.CDRom:
                        driveImage = 3;
                        break;
                    case DriveType.Network:
                        driveImage = 6;
                        break;
                    case DriveType.NoRootDirectory:
                        driveImage = 8;
                        break;
                    case DriveType.Unknown:
                        driveImage = 8;
                        break;
                    default:
                        driveImage = 2;
                        break;
                }

                TreeNode node = new TreeNode(drive.Substring(0, 1), driveImage, driveImage);
                node.Tag = drive;

                if (di.IsReady == true)
                    node.Nodes.Add("...");

                dirsTreeView.Nodes.Add(node);
            }

        }

        private void dirsTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes.Count > 0)
            {
                if (e.Node.Nodes[0].Text == "..." && e.Node.Nodes[0].Tag == null)
                {
                    e.Node.Nodes.Clear();

                    //get the list of sub direcotires
                    string[] dirs = Directory.GetDirectories(e.Node.Tag.ToString());

                    foreach (string dir in dirs)
                    {
                        DirectoryInfo di = new DirectoryInfo(dir);
                        TreeNode node = new TreeNode(di.Name, 0, 1);

                        try
                        {
                            //keep the directory's full path in the tag for use later
                            node.Tag = dir;

                            //if the directory has sub directories add the place holder
                            if (di.GetDirectories().Count() > 0)
                                node.Nodes.Add(null, "...", 0, 0);

                            foreach (var file in di.GetFiles())
                            {
                                TreeNode n = new TreeNode(file.Name, 13, 13);
                                node.Nodes.Add(n);
                            }

                        }
                        catch (UnauthorizedAccessException)
                        {
                            //display a locked folder icon
                            node.ImageIndex = 12;
                            node.SelectedImageIndex = 12;
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, "DirectoryLister",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        finally
                        {
                            e.Node.Nodes.Add(node);
                        }
                    }
                }
            }
        }
    }
}

我现在已经在应用程序中更新了我的代码并且只使用了一个树视图,但问题仍然存在。您可以在图像中看到,在我的 C 驱动器中,我有一个文件名“courses outline.html”和 ab.txt,它们没有显示在应用程序中,我需要查看它们。请参阅下面的 iamge 以轻松了解我的要求。

【问题讨论】:

  • 你看到我的回答了吗?它只适用于一个树视图..
  • 我找到了解决办法

标签: c# winforms treeview


【解决方案1】:

将 try 块中的代码(来自:List Drives and Folders in a TreeView Using C#)更改如下:

编辑:

添加以下代码,因为根目录的文件被忽略了:

//add files of rootdirectory
DirectoryInfo rootDir = new DirectoryInfo(e.Node.Tag.ToString());
foreach (var file in rootDir.GetFiles())
{
    TreeNode n = new TreeNode(file.Name, 13, 13);
    e.Node.Nodes.Add(n);
}

全班:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    if (e.Node.Nodes.Count > 0)
    {
        if (e.Node.Nodes[0].Text == "..." && e.Node.Nodes[0].Tag == null)
        {
            e.Node.Nodes.Clear();

            //get the list of sub direcotires
            string[] dirs = Directory.GetDirectories(e.Node.Tag.ToString());

            //add files of rootdirectory
            DirectoryInfo rootDir = new DirectoryInfo(e.Node.Tag.ToString());
            foreach (var file in rootDir.GetFiles())
            {
                TreeNode n = new TreeNode(file.Name, 13, 13);
                e.Node.Nodes.Add(n);
            }

            foreach (string dir in dirs)
            {
                DirectoryInfo di = new DirectoryInfo(dir);
                TreeNode node = new TreeNode(di.Name, 0, 1);

                try
                {
                    //keep the directory's full path in the tag for use later
                    node.Tag = dir;

                    //if the directory has sub directories add the place holder
                    if (di.GetDirectories().Count() > 0)
                        node.Nodes.Add(null, "...", 0, 0);

                    foreach (var file in di.GetFiles())
                    {
                        TreeNode n = new TreeNode(file.Name, 13, 13);
                        node.Nodes.Add(n);
                    }

                }
                catch (UnauthorizedAccessException)
                {
                    //display a locked folder icon
                    node.ImageIndex = 12;
                    node.SelectedImageIndex = 12;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "DirectoryLister",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    e.Node.Nodes.Add(node);
                }
            }
        }
    }
}

如下图所示:

【讨论】:

  • 感谢 Schena,我已经接近我的解决方案,我已经更新了我的原始帖子,请在编辑中查看。我需要尽快解决这个问题,非常感谢您的帮助。
  • 请分享解决方案,焦急等待,谢谢。
  • 我的帖子里早了
  • 天啊!你们正在默默地改变世界,继续努力。爱你的灵魂,非常感谢你:)。
【解决方案2】:

您可以使用枚举文件方法来获取目录位置中每个文件的名称。

string sourceDirectory = @"C:\current";
var files = Directory.EnumerateFiles(sourceDirectory);

foreach (string file in files)
{
    // Do Something with file
}

【讨论】:

  • 感谢您的回复,您提到的驱动器路径@“C:\current”基本上是一个节点名称,我通过这段代码(treeView1.SelectedNode.FullPath)得到了它。当我单击此节点 + 符号时,我会得到空白空间,而我需要包含在这些文件夹中的文件,这些文件显示为树视图节点,如果您从我提供的链接中复制并粘贴代码,您可以轻松理解我的观点,谢谢。跨度>
  • 请在我的原始帖子中查看编辑代码,谢谢。
  • 感谢您的回复,我按照您的建议编辑了代码,但它显示的文件错误,例如,如果文件存在于“C:\myfolder\myfile.pdf”中,则它显示在“c:\myfile.pdf”。我的要求是将文件完全显示在它存在的同一文件夹中。如果您可以运行我的代码,请在画布上插入两个树视图,如树视图 1 和树视图 2 以验证代码,感谢并感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多