如何检查特定驱动器的特定文件夹中是否存在某种类型的文件,并在C#

时间:2015-06-09 10:43:17

标签: c# directory getfiles

我想从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()))的代码中,即使文件夹中存在文件,我也没有得到任何值

4 个答案:

答案 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()方法递归查找文件。检查选项,您可以调整它以满足您的需求,而无需自己迭代目录:

https://msdn.microsoft.com/en-us/library/ms143316.aspx

答案 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)