Точное совпадение расширения файла с GetFiles ()?
Я хотел бы получить список файлов, расширения которых точно соответствуют указанной строке.
DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
myFiles.Add(fi);
}
Я получаю файлы с расширением *.txt
, но я также получаю файлы с расширением *.txtx
, поэтому то, что я закодировал, равносильно получению файлов, чье расширение начинается с txt
.
Это не то, чего я хочу. Нужно ли мне захватить все имена файлов и сделать регулярное выражение, соответствующее "\.txt$"
(я думаю), или проверить каждую строку имени файла с помощью .EndsWith(".txt")
и т. д., чтобы выполнить вот это?
Спасибо!
8 ответов:
Несколько обходной путь, но вы можете отфильтровать точные совпадения с помощью метода
Where
extesion:foreach (FileInfo fi in di.GetFiles("*.txt") .Where(fi => string.Compare(".txt", fi.Extension, StringComparison.OrdinalIgnoreCase) == 0)) { myFiles.Add(fi); }
Обратите внимание, что это сделает сопоставление расширения нечувствительным к регистру.
Использование функции AddRange списков вместо выполнения цикла foreach и вызова Add для каждого элемента, возвращаемого приведенным ниже выражением (которое я сохраняю в списке переменных).
Я предполагаю, что вы просто показывали нам фрагмент вашего кода, и myFiles уже имел значения в нем, если нет, вы могли бы сделать вместо этого.var list = di.GetFiles("*.txt").Where(f => f.Extension == ".txt"); myFiles.AddRange(list);
List<FileInfo> myFiles = di.GetFiles("*.txt").Where(f => f.Extension == ".txt").ToList();
Регулярное выражение может быть излишним. Используйте расширение на FileInfo.
foreach (FileInfo fi in di.GetFiles("*.txt").Where(f => f.Extension == ".txt")) { myFiles.Add(fi); }
Попробуйте это:
DirectoryInfo di = new DirectoryInfo(someValidPath); List<FileInfo> myFiles = ( from file in di.GetFiles("*.txt") where file.Extension == ".txt" select file ).ToList();
DirectoryInfo di = new DirectoryInfo(someValidPath); List<FileInfo> myFiles = new List<FileInfo>(); foreach (FileInfo fi in di.GetFiles("*.txt")) { if (fi.Extension == ".txt") myFiles.Add(fi); }
Если вы используете C# 2.0 Разве не проще ?
string fileExtensionFilter = "*.txt"; DirectoryInfo di = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); List<FileInfo> myFiles = new List<FileInfo>(); foreach (FileInfo fi in di.GetFiles(fileExtensionFilter)) { if (fi.Extension == fileExtensionFilter.Substring(1)) myFiles.Add(fi); }
У меня был пользовательский шаблон, поэтому многие другие ответы меня не устраивали. В итоге я пришел к решению более общего назначения:
public string[] GetFiles(string path, string pattern) { bool lastWildIsHook = false; if(pattern.EndsWith("?")) { pattern = pattern.Substring(0, pattern.Length - 1); lastWildIsHook = true; } var lastWildIndex = Math.Max(pattern.LastIndexOf("*"), pattern.LastIndexOf("?")); var endsWith = pattern.Length > lastWildIndex ? pattern.Substring(lastWildIndex + 1) : pattern; if(!lastWildIsHook) return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith)).ToArray(); else return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith) || p.Substring(0, p.Length - 1).EndsWith(endsWith)).ToArray(); }