按扩展名类型c#获取确切文件

时间:2015-07-10 14:22:56

标签: c#

我在将文件放入字符串[]时遇到一些麻烦。在我正在搜索的目录中有.docx和doc文件以及.xlsx和.xls文件之前,一切似乎都没问题。有人可以告诉我如何实现这个目标吗?

请查看我到目前为止的代码:

Filter = ".DOC|.DOCX|.XLS|.XLSX|.PDF|.TXT|.TIF|.TIFF"

public string[] getFiles(string SourceFolder, string Filter)
{
    // ArrayList will hold all file names
    System.Collections.ArrayList alFiles = new System.Collections.ArrayList();

    // Create an array of filter string
    string[] MultipleFilters = Filter.Split('|');

    // for each filter find mathing file names
    foreach (string FileFilter in MultipleFilters)
    {
        // add found file names to array list
        alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter));
    }

    // returns string array of relevant file names
    return (string[])alFiles.ToArray(typeof(string));
}

谢谢, 乔治

3 个答案:

答案 0 :(得分:1)

您可以利用LINQ' Distinct() System.Linq )。

  

使用默认的相等比较器来比较值,从序列中返回不同的元素。

Filter = ".DOC|.DOCX|.XLS|.XLSX|.PDF|.TXT|.TIF|.TIFF";

public string[] GetFiles(string SourceFolder, string Filter)
{
     List<string> alFiles = new List<string>();

     string[] MultipleFilters = Filter.Split('|');

     foreach (string FileFilter in MultipleFilters)
     {
         alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter));
     }

     return alFiles.Distinct().ToArray();
}

请注意,我现在正在创建一个新的List<string>实例( System.Collections.Generic ),而不是ArrayList

答案 1 :(得分:0)

首先,最初发布的代码不会返回任何文件,因为Directory.GetFiles()的所有调用都不会在过滤器中包含通配符。

其次,假设原始过滤器确实包含通配符,那么在MSDN Directory.GetFiles(string, string)文档中有一个令人讨厌的小惊喜:

  

在searchPattern中使用星号通配符时   as&#34; * .txt&#34;,指定扩展名中的字符数   影响搜索如下:

     

•如果指定的扩展名正好是三个字符长,那么   method返回扩展名为指定的扩展名的文件   延期。例如,&#34; * .xls&#34;返回&#34; book.xls&#34;   &#34; book.xlsx&#34;

     

•在所有其他情况下,该方法返回完全匹配的文件   指定的扩展名例如,&#34; * .ai&#34;返回&#34; file.ai&#34;但不是   &#34; file.aif&#34;

(强调补充)

而不是试图解决&#34;有用的&#34; Directory.GetFiles(string, string)重载的行为,我使用Directory.GetFiles(string)重载来获取所有文件,然后使用LINQ过滤结果:

public string[] getFiles(string SourceFolder, string Filter)
{
    string[] MultipleFilters = Filter.Split('|');

    var SelectedFiles = Directory.GetFiles(SourceFolder)
        .Where(f => MultipleFilters.Contains(Path.GetExtension(f).ToUpper()))
        .Select(f => f);

    return SelectedFiles.ToArray();
}

答案 2 :(得分:0)

如果文件夹中有大量文件,则获取所有文件可能会导致内存问题。 在下面的代码中,我正在搜索基于通配符过滤器的文件,然后使用LINQ过滤它们:)

string Filter = ".DOC|.DOCX|.XLS|.XLSX|.PDF|.TXT|.TIF|.TIFF" //without "*"
public string[] getFiles(string SourceFolder, string Filter)
{
    var filters = Filter.ToUpper().Split('|');
    return filters.SelectMany(filter => System.IO.Directory.GetFiles(SourceFolder, "*"+filter)).Where(file=> filters.Contains(Path.GetExtension(file).ToUpper())).ToArray();
}