C# listview打开目录

C# listview打开目录,c#,C#,我对C#很陌生。我的老板让我用listview作为文件浏览器编写一些代码。我试过了,似乎很管用。此代码用于打开驱动器中的文件并将其显示在listView上。这很简单。我还做了一个额外的功能,可以清除listView中显示的项目。我想添加额外的功能,在这里我还可以打开目录,而不仅仅是文件。 顺便说一下,下面是我的代码示例: private void btnOpen_Click(object sender, EventArgs e) { string strSelec

我对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="";
    }

您能告诉我怎么做吗?

如果我正确理解您的问题(您不仅要列出所选目录中的文件,还要列出子目录),您将需要研究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(stringpath)
)。在这种方法中,您可以从清除列表视图中的项目开始,设置标签文本,然后如上所述添加新内容

可以从
btnOpen\u 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方法完全不知道path参数来自何处;它可能来自文件夹浏览器、命令行或其他任何地方

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


当涉及到事件处理程序(如btnOpen_Click)时,我喜欢将它们视为触发器;它们会触发事件的发生,但它们本身并没有做很多事情。

DirectoryInfo类包含一个GetDirectories方法和一个GetFiles方法。请参见下面的原始代码示例,已修改为添加目录:

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();
    DirectoryInfo[] directories = di.GetDirectories();

    foreach (DirectoryInfo directory in directories)
    {
        listView1.Items.Add("Directory " + directory.Name);
    }
    foreach (FileInfo file in files)
    {
        listView1.Items.Add(file.Name);
    }
}

我相信这就是你想要的

    DirectoryInfo[] directories = di.GetDirectories();
    foreach (DirectoryInfo directory in directories)
    {
        listView1.Items.Add(directory.Name);
    }

我明白了,ListDirectoryContent你刚才为它指定了名称吗?或者我还可以选择其他名称吗?