通过扩展类型c#获取确切的文件

本文关键字:文件 获取 扩展 类型 | 更新日期: 2023-09-27 18:02:10

我在将文件放入字符串[]时遇到了一点麻烦。一切似乎都很好,直到我有一个。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));
}

谢谢,乔治

通过扩展类型c#获取确切的文件

你可以利用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

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

第二,假设原始过滤器确实包含通配符,在MSDN目录中有一个令人讨厌的小惊喜。GetFiles(string, string) documentation:

当您在搜索模式中使用星号通配符时,例如如"*.txt",指定扩展名中的字符数对搜索的影响如下:

•如果指定的扩展名正好是三个字符长,则方法返回扩展名以指定的开头的文件扩展。例如,"*.xls"返回"book.xls" "book.xlsx"。

•在所有其他情况下,该方法返回完全匹配的文件指定的扩展名。例如,"*"。Ai"返回"文件。"唉!"file.aif"。

(重点)

而不是试图绕过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();
}

如果文件夹中有大量文件,那么获取所有文件可能会导致内存问题。在下面的代码中,我基于通配符过滤器搜索文件,然后使用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();
}