Использование Directory.GetFiles с регулярным выражением в С#?

235
24

У меня есть этот код:


string[] files = Directory.GetFiles(path, "......", SearchOption.AllDirectories)

Я хочу вернуть только файлы, которые НЕ запускаются с p_ и t_ и имеют расширение png или jpg или gif. Как мне это сделать?

спросил(а) 2021-01-19T11:20:05+03:00 6 месяцев назад
1
Решение
350

Directory.GetFiles по умолчанию не поддерживает RegEx, вы можете фильтровать по RegEx в списке файлов. Посмотрите на это объявление:

Regex reg = new Regex(@"^^(?!p_|t_).*");

var files = Directory.GetFiles(yourPath, "*.png; *.jpg; *.gif")
.Where(path => reg.IsMatch(path))
.ToList();

ответил(а) 2021-01-19T11:20:05+03:00 6 месяцев назад
135

Вы не можете вставить в параметр значение Regex, это просто простой фильтр строк. Попробуйте использовать LINQ для фильтрации потом.

var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".jpg") || s.EndsWith(".png"))
.Where(s => s.StartsWith("p_") == false && s.StartsWith("t_") == false)

ответил(а) 2021-01-19T11:20:05+03:00 6 месяцев назад
78

Попробуйте этот код, также ищите каждый диск:


DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
if (drive.RootDirectory.Exists)
{
DirectoryInfo darr = new DirectoryInfo(drive.RootDirectory.FullName);
DirectoryInfo[] ddarr = darr.GetDirectories();
foreach (DirectoryInfo dddarr in ddarr)
{
if (dddarr.Exists)
{
try
{
Regex regx = new Regex(@"^(?!p_|t_)");
FileInfo[] f = dddarr.GetFiles().Where(path => regx.IsMatch(path));
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo ff in f)
{
if (ff.Extension == "*.png " || ff.Extension == "*.jpg")
{
myFiles.Add(ff);
Console.WriteLine("File: {0}", ff.FullName);
Console.WriteLine("FileType: {0}", ff.Extension);
}
}
}
catch
{
Console.WriteLine("File: {0}", "Denied");
}
}
}
}
}

ответил(а) 2021-01-19T11:20:05+03:00 6 месяцев назад
45

Чтобы использовать метод Enumerable Where, необходимо включить следующую строку в верхней части файла:

using System.Linq;

ответил(а) 2021-01-19T11:20:05+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема