listview开放目录

时间:2009-05-24 20:12:43

标签: 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="";
    }

你能告诉我怎么样吗?

3 个答案:

答案 0 :(得分:5)

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

你可以这样做,也许:

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))。在此方法中,您可以从清单视图中清除项目,设置标签文本,然后添加上述新内容。

可以使用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); } } 更简洁。< / p>

该方法的完整代码示例:

{{1}}

此代码的优点是,无论何时需要浏览文件夹,都可以重复使用BrowseForFolder方法,因为它只返回选定的路径,并且没有连接到路径的用途。同样,ListDirectoryContent方法完全没有意识到path参数的来源;它可能来自文件夹浏览器,它可能来自命令行或其他任何地方。

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

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

答案 1 :(得分:0)

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);
    }
}

答案 2 :(得分:0)

我相信这就是你想要的?

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