通过扩展类型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));
}
谢谢,乔治
你可以利用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();
}