Я пытаюсь получить все файлы, начинающиеся с определенного имени (без учета регистра).
Directory.GetFiles, похоже, чувствителен к регистру в OSX (но не в Windows), поэтому мне интересно, какие у меня параметры. Каталог может быть потенциально большой, поэтому получение всех файлов и фильтрация в памяти, вероятно, не самая лучшая идея.
Я использую Unity, у которого есть предварительная версия в формате pre 4.0, поэтому нельзя использовать 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).
В качестве хака вы могли бы ограничить количество файлов, возвращаемых 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()
и фильтрацию, как показано выше. Вы можете найти, что он работает достаточно хорошо.