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()
方法一次获取目录中的所有文件,并按上述方式过滤结果。您可能会发现它运行良好。
我正在尝试获取所有以特定名称开头的文件(不区分大小写)。
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()
方法一次获取目录中的所有文件,并按上述方式过滤结果。您可能会发现它运行良好。