如何在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));
}
如果返回一个字符串数组(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);