我需要一些帮助,使用LINQ根据文件大小提交文件列表。我有一些代码,但它使用file.length而不是FileInfo(文件).length。我不知道如何在表达式中实现对象'FileInfo'。 HELP?
{
IEnumerable<string> result = "*.ini,*.log,*.txt"
.SelectMany(x => Directory.GetFiles("c:\logs", x, SearchOption.TopDirectoryOnly))
;
result = result
.Where(x => (x.Length) > "500000")
;
}
答案 0 :(得分:4)
你应该可以做这样的事情。
使用DirectoryInfo,GetFiles将返回FileInfo的集合而不是字符串。
new DirectoryInfo(@"c:\logs")
.GetFiles("*.ini,*.log,*.txt", SearchOption.TopDirectoryOnly)
.Where(f => f.Length > 500000);
当然,如果你愿意的话,你总是会内联创建FileInfo。
如果你只想要文件名...
IEnumerable<string> results = new DirectoryInfo(@"c:\logs")
.GetFiles("*.ini,*.log,*.txt", SearchOption.TopDirectoryOnly)
.Where(f => f.Length > 500000)
.Select(f => f.FullName);
答案 1 :(得分:2)
对不起。 Searchpattern无法检查多个扩展程序。
看到这篇文章: http://msdn.microsoft.com/en-us/library/aa328752(VS.71,loband).aspx 基本上这些是您的搜索模式工具:
遗憾的是,没有像“OR”这样的分隔符。
您应该使用正则表达式模式:
Regex filepattern = new Regex(".log|.txt|.ini");
var test = new DirectoryInfo("C:\\")
.GetFiles("*", SearchOption.TopDirectoryOnly)
.Where(f => f.Length > 0 && filepattern.IsMatch(f.FullName));
说明Quintin Robinson正在谈论的内容:
var dir = new DirectoryInfo("C:\\");
var test = dir
.GetFiles("*.txt", SearchOption.TopDirectoryOnly)
.Concat(dir.GetFiles("*.log", SearchOption.TopDirectoryOnly))
.Concat(dir.GetFiles("*.ini", SearchOption.TopDirectoryOnly))
.Where(f => f.Length > 0);
他认为GetFiles经过了大量优化,而且速度更快 - 特别是对于包含大量文件的目录。我没有对它进行基准测试,真的不知道哪个最快:)
这两种方法都有效。我测试了它们并给出了相同的结果