如何在C#中检查特定驱动器的特定文件夹中是否存在某种类型的文件,并在更短的时间内仅返回目录路径
本文关键字:时间 路径 返回 驱动器 检查 文件夹 是否 类型 种类 存在 文件 | 更新日期: 2023-09-27 17:54:42
我想从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);
}
}
更新1:正在检查此链接确实给了我一个递归和忽略文件的想法,但没有最小化搜索文件所需的时间。
更新2:-在我使用if(mediaExtensions.Contains(Path.GetExtension(f).ToLower()))
的上述代码中,即使文件夹
第一个解决方案:(.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
Win-Api函数:https://msdn.microsoft.com/en-us/library/aa364428%28v=vs.85%29.aspx
您可以使用Directory.GetFiles()
方法递归查找文件。检查选项,您可以调整它以满足您的需求,而无需自己迭代目录:
https://msdn.microsoft.com/en-us/library/ms143316.aspx
使用此:
foreach (string f in Directory.GetFiles(d, "*.txt"))
{
// return ".txt file found in d
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)