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

Directory.GetFiles search pattern on Mono/OS X

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

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

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

有什么解决方法吗?

恕我直言,我提出的链接问题应该足够了。但为了完整和清晰起见,我的意思是你要做的:

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 源代码中复制实现)。

作为 hack,您至少可以通过应用部分过滤器来限制 Directory.GetFiles() 返回的文件数量。例如:

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() 方法一次获取目录中的所有文件,并按上述方式过滤结果。您可能会发现它运行良好。