Seb*_*son 125 .net c# system.io.directory
什么是设置语法多个文件的扩展为searchPattern上Directory.GetFiles()?例如,使用.aspx和.ascx扩展名过滤掉文件.
// TODO: Set the string 'searchPattern' to only get files with
// the extension '.aspx' and '.ascx'.
var filteredFiles = Directory.GetFiles(path, searchPattern);
Run Code Online (Sandbox Code Playgroud)
更新:LINQ不是一个选项,它必须是一个searchPattern传入GetFiles,如问题中所指定的.
jga*_*fin 184
var filteredFiles = Directory
.GetFiles(path, "*.*")
.Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("ascx"))
.ToList();
Run Code Online (Sandbox Code Playgroud)
编辑2014-07-23
您可以在.NET 4.5中执行此操作以获得更快的枚举:
var filteredFiles = Directory
.EnumerateFiles(path) //<--- .NET 4.5
.Where(file => file.ToLower().EndsWith("aspx") || file.ToLower().EndsWith("ascx"))
.ToList();
Run Code Online (Sandbox Code Playgroud)
MSDN中的Directory.EnumerateFiles
Dan*_*l B 38
我相信没有"开箱即用"的解决方案,这是Directory.GetFiles方法的限制.
编写自己的方法相当容易,这是一个例子.
代码可以是:
Run Code Online (Sandbox Code Playgroud)/// <summary> /// Returns file names from given folder that comply to given filters /// </summary> /// <param name="SourceFolder">Folder with files to retrieve</param> /// <param name="Filter">Multiple file filters separated by | character</param> /// <param name="searchOption">File.IO.SearchOption, /// could be AllDirectories or TopDirectoryOnly</param> /// <returns>Array of FileInfo objects that presents collection of file names that /// meet given filter</returns> public string[] getFiles(string SourceFolder, string Filter, System.IO.SearchOption searchOption) { // ArrayList will hold all file names ArrayList alFiles = new 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, searchOption)); } // returns string array of relevant file names return (string[])alFiles.ToArray(typeof(string)); }
小智 30
GetFiles只能匹配单个模式,但您可以使用Linq调用具有多个模式的GetFiles:
FileInfo[] fi = new string[]{"*.txt","*.doc"}
.SelectMany(i => di.GetFiles(i, SearchOption.AllDirectories))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
请参阅以下评论部分:http: //www.codeproject.com/KB/aspnet/NET_DirectoryInfo.aspx
Mar*_*arc 18
我喜欢这种方法,因为它是可读的并且避免了目录的多次迭代:
var allowedExtensions = new [] {".doc", ".docx", ".pdf", ".ppt", ".pptx", ".xls", ".xslx"};
var files = Directory
.GetFiles(folder)
.Where(file => allowedExtensions.Any(file.ToLower().EndsWith))
.ToList();
Run Code Online (Sandbox Code Playgroud)
Jod*_*ell 15
我担心你必须做这样的事情,我从这里改变了正则表达式.
var searchPattern = new Regex(
@"$(?<=\.(aspx|ascx))",
RegexOptions.IgnoreCase);
var files = Directory.EnumerateFiles(path)
.Where(f => searchPattern.IsMatch(f))
.ToList();
Run Code Online (Sandbox Code Playgroud)
drz*_*aus 14
var filteredFiles = Directory
.EnumerateFiles(path, "*.*") // .NET4 better than `GetFiles`
.Where(
// ignorecase faster than tolower...
file => file.ToLower().EndsWith("aspx")
|| file.EndsWith("ascx", StringComparison.OrdinalIgnoreCase))
.ToList();
Run Code Online (Sandbox Code Playgroud)
Directory.EnumerateFiles以提高性能(Directory.EnumerateFiles与Directory.GetFiles有什么区别?)或者,拆分和合并你的globs可能会更快(至少它看起来更干净):
"*.ext1;*.ext2".Split(';')
.SelectMany(g => Directory.EnumerateFiles(path, g))
.ToList();
Run Code Online (Sandbox Code Playgroud)
易于记忆、懒惰且可能不完美的解决方案:
Directory.GetFiles(dir, "*.dll").Union(Directory.GetFiles(dir, "*.exe"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
178430 次 |
| 最近记录: |