我想从D盘找到所有文档文件。我写了下面的代码,但它太耗时了。 另外由于在获取数据时消耗更多时间,因此它给我带来了异常。 为了尽量减少时间,我只想这样检查:
即使该文件夹中存在其中一种类型的文件 - >返回文件夹的路径
这样就不需要检查同一文件夹中的所有文件类型 例如: -
如果C:\Program Files\Notepad++
有readme.txt
和其他文本文件。它检测到此文件夹中的第一个文本文件时,必须返回:C:\Program Files\Notepad++
我在文件中使用的代码
List<string> mediaExtensions = new List<string>{"txt", "pdf"};
List<string> filesFound = new List<string>();
void DirSearch(string sDir)
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, "*.*"))
{
if(mediaExtensions.Contains(Path.GetExtension(f).ToLower()))
filesFound.Add(f);
}
DirSearch(d);
}
}
UPDATE1: 检查此link 确实给了我一个关于递归和忽略文件的想法,但没有最小化搜索文件所花费的时间。
UPDATE2: -
在上面使用if(mediaExtensions.Contains(Path.GetExtension(f).ToLower()))
的代码中,即使文件夹中存在文件,我也没有得到任何值
答案 0 :(得分:1)
第一个解决方案:(。NET 4.0)
这可以加快速度:
DirectoryInfo dirInfo = new DirectoryInfo(myBaseDirectory);
return dirInfo.EnumerateDirectories()
.AsParallel()
.SelectMany(di => di.EnumerateFiles("*.*", SearchOption.AllDirectories));
}
第二种解决方案:(。Net 3.5和4.0)
如果这没有帮助检查基于WinAPI函数的更快的目录枚举器
资料来源:http://www.codeproject.com/Articles/38959/A-Faster-Directory-Enumerator
赢取Api功能:https://msdn.microsoft.com/en-us/library/aa364428%28v=vs.85%29.aspx
答案 1 :(得分:0)
您可以使用Directory.GetFiles()
方法递归查找文件。检查选项,您可以调整它以满足您的需求,而无需自己迭代目录:
答案 2 :(得分:0)
使用此:
foreach (string f in Directory.GetFiles(d, "*.txt"))
{
// return ".txt file found in d
答案 3 :(得分:0)
List<string> mediaExtensions = new List<string>{"txt", "pdf"};
List<string> filesFound = new List<string>();
void DirSearch(string sDir)
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, "*.*"))
{
if(mediaExtensions.Contains(Path.GetExtension(f).ToLower()))
filesFound.Add(f);
//you said you also need the path of the directory, add it from here
break;
}
DirSearch(d);
}
}
当你添加f参数时,尝试同时添加外部foreach中的d一个,你的要求是添加至少一个文件夹,其中包含所需的扩展名。
编辑1
当您遇到文档和设置时,您必须使用
访问它var mydocumentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)