以下作品,但我认为 - 因为它全部基于IEnumerable
,Linq
可以派上用场。顺便说一句,是否有一个等价的Directory.GetFiles()
将返回IEnumerable而不是数组?如果它存在,那么它会使代码运行得更快吗?问题的最后一部分受到Python语言的启发,它支持轻量级生成器而不是具体列表。
private IEnumerable<string> getFiles(string strDirectory, bool bCompressedOnly)
{
foreach (var strFile in Directory.GetFiles(strDirectory))
{
// Don't add any existing Zip files since we don't want to delete previously compressed files.
if (!bCompressedOnly || Path.GetExtension(strFile).ToLower().Equals(".zip"))
{
yield return strFile;
}
}
foreach (var strDir in Directory.GetDirectories(strDirectory))
{
foreach (var strFile in getFiles(strDir, bCompressedOnly))
{
yield return strFile;
}
}
}
答案 0 :(得分:7)
我认为我不喜欢这个但是......
return (
from file in Directory.GetFiles(strDirectory)
where !bCompressedOnly
|| Path.GetExtension(file).ToLower().Equals(".zip")
select file
).Concat(
from directory in Directory.GetDirectories(strDirectory)
from file in getFiles(directory, bCompressedOnly)
select file
);
.NET 4中的新功能:
private static IEnumerable<string> getFiles(string strDirectory,
bool bCompressedOnly)
{
return Directory.EnumerateFiles(strDirectory,
bCompressedOnly ? "*.zip" : "*.*", SearchOption.AllDirectories);
}
答案 1 :(得分:2)
我没有信用,因为我让ReSharper为我做了,但这是它的建议。
private IEnumerable<string> getFiles(string strDirectory, bool bCompressedOnly) {
foreach (var strFile in Directory.GetFiles(strDirectory).Where(strFile => !bCompressedOnly || Path.GetExtension(strFile).ToLower().Equals(".zip"))) {
yield return strFile;
}
foreach (var strFile in Directory.GetDirectories(strDirectory).SelectMany(strDir => getFiles(strDir, bCompressedOnly))) {
yield return strFile;
}
}
它们都是随意的变化,并且在某些方面我认为(至少在第一个循环中)它们对逻辑进行了一些混淆,但是接受或者离开它。另外,如果您还没有,请查看ReSharper。 :)
答案 2 :(得分:2)
GetFiles
有一个Directory
重载方法,它采用搜索模式字符串和System.IO.SearchOption
枚举。 SearchOption
值之一是AllDirectories
。如果使用它,你将摆脱你的方法的第二个循环。
private IEnumerable<string> getFiles(string strDirectory, bool bCompressedOnly)
{
foreach (var strFile in Directory.GetFiles(strDirectory, bCompressedOnly ? "*.zip" : "*.*", SearchOption.AllDirectories))
{
yield return strFile;
}
}