c# - ListView 打开目录

标签 c#

我是 C# 的新手。我的老板要求我使用 listview 作为文件浏览器编写一些代码。我试过了,它似乎有效。此代码用于打开驱动器中的文件并将其显示在 listView 上。这很简单。我还做了一个额外的功能,可以清除 listView 中显示的项目。我想添加其他功能,我还可以在其中打开目录,而不仅仅是文件。 顺便说一句,这是我的代码示例:

    private void btnOpen_Click(object sender, EventArgs e)
    {
        string strSelectedPath;

        folderBrowserDialog1.ShowDialog();
        strSelectedPath = folderBrowserDialog1.SelectedPath;

        label1.Text = strSelectedPath;



        DirectoryInfo di = new DirectoryInfo(strSelectedPath);
        FileInfo[] files = di.GetFiles();

        foreach (FileInfo file in files)
        {
            listView1.Items.Add(file.Name);
        }
    }

    private void btnClear_Click(object sender, EventArgs e)
    {

        listView1.Items.Clear();
        label1.Text="";
    }

你能告诉我怎么做吗?

最佳答案

如果我正确理解你的问题(你不仅要列出所选目录中的文件,还要列出子目录),你将需要查看 GetDirectories DirectoryInfo 类的方法。

你可以做这样的事情,也许:

DirectoryInfo di = new DirectoryInfo(strSelectedPath);
// first list sub-directories
DirectoryInfo[] dirs = di.GetDirectories();
foreach (DirectoryInfo dir in dirs)
{
    listView1.Items.Add(dir.Name);
}
// then list the files
FileInfo[] files = di.GetFiles();
foreach (FileInfo file in files)
{
    listView1.Items.Add(file.Name);
}

更新:我建议您将上面的代码移动到一个单独的方法中,该方法采用字符串参数作为路径(类似于 ListDirectoryContents(string path))。在此方法中,您可以首先从 ListView 中清除项目,设置标签文本,然后添加新内容,如上所示。

可以从您的 btnOpen_Click 方法调用此方法,在路径参数中传递 folderBrowserDialog1.SelectedPath

我通常尽量让我的事件处理程序尽可能小,最好不执行任何实际工作,而只是调用其他一些完成工作的方法。这为从其他地方触发相同的功能打开了更多空间。

举例来说,您的应用程序可以将路径作为命令行参数,那么与在您的应用程序中复制相同的行为相比,使用命令行中的路径调用 ListDirectoryContents 代码会更简洁形式。

该方法的完整代码示例:

private void btnOpen_Click(object sender, EventArgs e)
{
    string path = BrowseForFolder();
    if (path != string.Empty)
    {
        ListDirectoryContent(path);
    }
}

private string BrowseForFolder()
{
    FolderBrowserDialog fbd = new FolderBrowserDialog();
    if (fbd.ShowDialog() == DialogResult.OK)
    {
        return fbd.SelectedPath;
    }
    return string.Empty;
}

private void ListDirectoryContent(string path)
{
    label1.Text = path;
    listView1.Items.Clear();
    DirectoryInfo di = new DirectoryInfo(path);
    // first list sub-directories
    DirectoryInfo[] dirs = di.GetDirectories();
    foreach (DirectoryInfo dir in dirs)
    {
        listView1.Items.Add(dir.Name);
    }
    // then list the files
    FileInfo[] files = di.GetFiles();
    foreach (FileInfo file in files)
    {
        listView1.Items.Add(file.Name);
    }

}

这段代码的优点是,只要您需要浏览文件夹,就可以重用 BrowseForFolder 方法,因为它只返回选定的路径,而与路径的用途无关。同样,ListDirectoryContent 方法完全不知道路径参数来自何处;它可能来自文件夹浏览器,也可能来自命令行或其他任何地方。

如果您专注于让您的方法只执行它们的“核心任务”,依靠输入参数获取它们需要的任何额外信息,您将获得更易于重用和维护的代码。

谈到事件处理程序(例如 btnOpen_Click),我喜欢将它们视为触发器;他们触发事情发生,但他们自己并没有真正做很多事情。

关于c# - ListView 打开目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/904559/

相关文章:

javascript - ASP.NET 隐藏字段不发布

c# - 解决 C# 和 C++/CLI 项目之间的循环项目依赖性?

c# - Silverlight C# webservices 等待进程

c# - DataTables - 水平滚动条部分覆盖最后一行

c# - SQL中的位逻辑

c# - Entity Framework Fluent API 映射

c# - 将自定义信息添加到 CSPROJ 文件

c# - 我可以更好地重写此 LINQ to XML 吗?

c# - 从不同库中的方法从 `dynamic` 结果读取属性时出现 RuntimeBinderException

c# - 如何将 EDMX 嵌入 Code First 程序集中?