首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

本人想搜索出整个硬盘的指定类型的文件(如TXT),还请各位热心帮忙解决,先谢了!解决方法

2012-01-14 
本人想搜索出整个硬盘的指定类型的文件(如TXT),还请各位热心帮忙解决,先谢了!功能:通过程序自动搜索所有驱

本人想搜索出整个硬盘的指定类型的文件(如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测试通过.

热点排行