如何在C#窗体中显示从选定驱动器到列表视图的.mdf文件

本文关键字:列表 驱动器 视图 文件 mdf 窗体 显示 | 更新日期: 2023-09-27 18:27:01

我对尝试使用组合框(下拉菜单样式)在列表视图中显示所选驱动器(例如C:D:)中的所有.mdf文件(和其他数据库文件)感到困惑。

不知怎的,代码的想法从我的脑海中消失了

private void Form1_Load(object sender, EventArgs e)
{
    foreach (DriveInfo dir in DriveInfo.GetDrives())
        cmbDrive.Items.Add(dir.ToString());
}
private void btnScan(object sender, EventArgs e)
{
    ListViewItem item = new ListViewItem(Directory.GetFiles(cmbDrive.Text));
    string path = cmbDrive.Text;
    string extension = "*.mdf";
    lstvwdb2.Items.Add(Directory.GetFiles(path, extension));
}

如何在C#窗体中显示从选定驱动器到列表视图的.mdf文件

如果返回一个字符串数组(Directory.GetFiles),则应循环遍历返回的文件名列表,并逐个添加每一项。如果尝试添加整个数组,则会出现异常,因为ListViewItemCollection.Add方法无法处理数组。

但是,请记住,只有两个参数的Directory.GetFiles只返回与扩展名变量匹配的文件,并且这些文件确切地位于由路径变量表示的文件夹中(在您的情况下是驱动器的根目录)。如果任何MDF文件位于该路径变量的子文件夹中,则上述GetFiles调用不会捕获该文件。GetFiles重载了一个枚举值,该值指示GetFiles方法在所有底层子文件夹上递归工作。它的使用与否取决于您的要求

private void btnScan(object sender, EventArgs e)
{
    string path = cmbDrive.Text;
    string extension = "*.mdf";
    string[] files = Directory.GetFiles(path, extension);
    //string[] files = Directory.GetFiles(path, extension, SearchOption.AllDirectories);
    foreach(string s on files)
        lstvwdb2.Items.Add(s);
}

请注意,使用AllDirectories选项在C:驱动器上搜索可能会出现问题,因为如果您尝试读取这些文件夹,会出现大量保留文件夹,从而导致异常。

为了绕过这个问题,你可以在这里复制Marc Gravell在其答案中提供的代码,并将其粘贴到一个实用程序类(例如FileUts类)中,然后使用foreach调用该方法而不是Directory.GetFiles 进行循环

private void btnScan(object sender, EventArgs e)
{
    string path = cmbDrive.Text;
    string extension = "*.mdf";
    foreach(string s in FileUts.GetFiles(path, extension))
        lstvwdb2.Items.Add(s);
}
public static class FileUts
{
    // Code provided by Marc Gravell
    public static IEnumerable<string> GetFiles(string root, string searchPattern)
    {
       .....
    }
}

看起来你有点乱
列表视图项可以在构造函数中采用string[],列表视图的项集合应该在其add方法中采用列表视图项。

试试这样的东西:

// this is what you want to add to your lstvwdb2 items !!
string path = cmbDrive.Text;
string extension = "*.mdf";
ListViewItem item = new ListViewItem(Directory.GetFiles(cmbDrive.Text));
// You should add the above to your items collection
lstvwdb2.Items.Add(item);