如何在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()))的上述代码中,即使文件夹

如何在C#中检查特定驱动器的特定文件夹中是否存在某种类型的文件,并在更短的时间内仅返回目录路径

中存在文件,我也不会得到任何值

第一个解决方案:(.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)