本人想搜索出整个硬盘的指定类型的文件(如TXT),还请各位热心帮忙解决,先谢了!
功能:通过程序自动搜索所有驱动盘中的指定类型的文件
已用方法:
1、通过全盘目录递归方式查找文件,但是其速度太慢,并且操作界面会导致死锁,没法点击
2、利用OpenFileDialog对象,设置文件夹与过滤条件后,取得的filenames总为空
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "C:\\Documents and Settings\\Administrator " ;
openFileDialog1.Filter = "*.txt|*.xsl ";
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true;
foreach (string a in (openFileDialog1.FileNames))
{
textBox3.Text += a;}
本人手头的分不多了,还请各位热心帮助,先谢了!
QQ:71181397
[解决办法]
public void FindFile(string pathstr)
{
DirectoryInfo Dir = new DirectoryInfo(pathstr);
try
{
//textBox1为基础文件夹,textBox2为文件的扩展名
foreach (DirectoryInfo d in Dir.GetDirectories())
{
FindFile(Dir+d.ToString()+ "\\ ");
richTextBox1.AppendText(Dir + d.ToString() + "\\ ");
richTextBox1.AppendText( "\n ");
}
foreach (FileInfo f in Dir.GetFiles( "*. "+textBox2.Text))
{
richTextBox1.AppendText(Dir+f.ToString());
richTextBox1.AppendText( "\n ");
}
}
catch
{
}
}
textbox2.text是文件格式,希望对你有用
[解决办法]
private void FindFiles(string _strPath,MenuItem menuItemParent)
{
DirectoryInfo[] dinfo;
FileInfo[] finfo;
DirectoryInfo directoryinfo;
MenuItem _menuItemFolder;
MenuItem _menuItemFile;
//当前路径下信息
directoryinfo=new DirectoryInfo(_strPath);
//文件夹信息
dinfo= directoryinfo.GetDirectories();
//当前路径下所有文件
finfo =directoryinfo.GetFiles(@ "*. "+this.strFileType);
if(finfo.Length==0)//若当前路径下不存在文件
{
}
else//若当前路径下存在文件
{
for(int j=0;j <finfo.Length;j++)
{
//this.listBox1.Items.Add(finfo[j].FullName);
_menuItemFile=new MenuItem(System.IO.Path.GetFileName(finfo[j].FullName));
_menuItemFile.Click+=new EventHandler(OpenFile);
//_menuItemFile.
//menuItemParent.MenuItems.Add(new MenuItem(System.IO.Path.GetFileName(finfo[j].FullName)));
menuItemParent.MenuItems.Add(_menuItemFile);
}
}
//当前路径下所有文件夹
if(dinfo.Length==0)//若当前目录路径下不存在下属文件夹
{
}
else
{
//this.intDepthPosition++;
//if(this.intDepthPosition <this.intFindDepth+1)
//{
for(int i=0;i <dinfo.Length;i++)
{
//_menuItemFolder=new MenuItem(System.IO.Path.GetDirectoryName(dinfo[i].FullName));
_menuItemFolder=new MenuItem(dinfo[i].FullName.Replace(_strPath, " ").Replace(@ "\ ", " "));
menuItemParent.MenuItems.Add(_menuItemFolder);
this.FindFiles(dinfo[i].FullName,_menuItemFolder);
}
}
}
[解决办法]
防止UI假死应该使用多线程 否则没有办法 搜索大量文件本身必须费时间
可以用Directory.GetFiles(path, "*.txt ",SearchOption.AllDirectories)
[解决办法]
vs2003里面没有SearchOption,可以用递归的方法来解决
class Class1
{
public void GetFiles(string path)
{
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(path);
// 使用递归检索子目录
System.IO.DirectoryInfo[] subdirs = dir.GetDirectories();
foreach (System.IO.DirectoryInfo subdir in subdirs)
{
this.GetFiles(subdir.FullName);
}
// 检索目录下的文件
System.IO.FileInfo[] fis = dir.GetFiles( "*.txt ");
foreach (System.IO.FileInfo fi in fis)
{
Console.WriteLine(fi.Name);
}
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
new Class1().GetFiles(@ "c:\ ");
Console.ReadLine();
}
}
UI假死的话解决办法一般都是把这些操作放到线程中执行
[解决办法]
System.IO.FileInfo[] c = this.GetFile( "C:\\ ");
private System.IO.FileInfo[] GetFile(string strDir)
{
System.IO.DirectoryInfo aa = new System.IO.DirectoryInfo(strDir);
if (aa.GetDirectories().GetLength(0) > 0)
{
foreach (System.IO.DirectoryInfo d in aa.GetDirectories())
{
Application.DoEvents();
System.IO.FileInfo[] fi = GetFile(d.FullName);
foreach (System.IO.FileInfo f in fi)
{
Application.DoEvents();
listView1.Items.Add(f.Name);
}
}
}
return aa.GetFiles();
}
这个是获取指定目录下所有文件名的代码,测试过不会死机.关键是每个循环都用Application.DoEvents();
如果按楼主所说,只要列出本机的所有驱动器,然后将驱动器分别调用这个函数,然后在listView1.Items.Add(f.Name);之前判断扩展名是否楼主所需要的就行了.
在2.0测试通过.