Directory.GetFiles Mono / OS X上的搜索模式

时间:2015-01-20 23:32:17

标签: c# mono

我试图获取所有以特定名称开头的文件(不区分大小写)。

Directory.GetFiles似乎在OSX上是区分大小写的(但不是在Windows上),所以我想知道我的选择是什么。该目录可能很大,因此获取所有文件并在内存中过滤可能不是最好的主意。

我使用具有4.0之前单声道运行时间的Unity,因此无法使用EnumerateFiles。

有任何变通方法吗?

1 个答案:

答案 0 :(得分:0)

恕我直言,我建议作为复制品的相关问题应该足够了。但为了完整性和清晰度,我的意思是:

IEnumerable<string> EnumerateSpecificFiles(
    string directory, string initialTextForFileName)
{
    foreach (string file in Directory.EnumerateFiles(directory))
    {
        if (file.StartsWith(initialTextForFileName, StringComparison.OrdinalIgnoreCase))
        {
            yield return file;
        }
    }
}

这样可以避免在内存中包含整个文件名列表,同时仍允许您执行不区分大小写的搜索。


修改

鉴于事实证明你使用的是早期版本的Mono,它不包含Directory.EnumerateFiles()方法,你的下一个最佳选择是继续使用p / invoke自己实现该方法(甚至可能只是从当前的Mono源复制实现。)

作为黑客攻击,您至少可以通过应用部分过滤器来限制Directory.GetFiles()返回的文件数。 E.g:

IEnumerable<string> EnumerateSpecificFiles(
    string directory, string initialTextForFileName)
{
    char[] initialCharacters =
        {
            char.ToLowerInvariant(initialTextForFileName[0]),
            char.ToUpperInvariant(initialTextForFileName[0])
        };

    foreach (char ch in initialCharacters)
    {
        foreach (string file in Directory.GetFiles(directory, ch + "*"))
        {
            if (file.StartsWith(initialTextForFileName, StringComparison.OrdinalIgnoreCase))
            {
                yield return file;
            }
        }
    }
}

最后,您可以考虑使用Directory.GetFiles()方法一次性获取目录中的所有文件,并按上述方式过滤该结果。你可能会发现它运作良好。