我在将文件放入字符串[]时遇到一些麻烦。在我正在搜索的目录中有.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));
}
谢谢, 乔治
答案 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();
}