Я хочу выбрать имена файлов, начиная с префикса NVH, только из каталога. Не следует выбирать имена файлов, начинающиеся с NVHE из того же каталога. Как я могу это сделать?
Я пробовал некоторые вещи. Они следующие. Они
//This will store all file names beginning with NVH prefix and NVHE prefix in array
string[] files11 = Directory.GetFiles(moduleDir, "NVH*.*")
.Select(path => Path.GetFileName(path))
.ToArray();
//This will store all file names beginning with NVHE prefix in array only
string[] files12 = Directory.GetFiles(moduleDir, "NVHE*.*")
.Select(path => Path.GetFileName(path))
.ToArray();
Теперь я хочу, чтобы имена файлов начинались только с NVH, а не NVHE. Как я могу это сделать?
Directory.GetFiles
не поддерживает регулярные выражения:
Строка поиска соответствует именам файлов в пути. Этот параметр может содержать комбинацию действительных символов литерала и шаблона (* и?) (См. Примечания), но не поддерживает регулярные выражения.
В качестве альтернативы вы можете использовать Directory.EnumerateFiles:
Directory.EnumerateFiles(moduleDir)
.Select(Path.GetFileName)
.Where(file=>file.StartsWith("NVH") && !file.StartsWith("NVHE"));
Если вы хотите сохранить полный путь к файлам:
Directory.EnumerateFiles(moduleDir)
.Where(path=>
{
var file = Path.GetFileName(path);
return file.StartsWith("NVH") && !file.StartsWith("NVHE")
});
Вы также можете использовать свой существующий код и фильтровать первую коллекцию таким образом:
var result = files11.Except(files12)
Хорошо, поскольку вы используете LINQ уже, почему бы не добавить в " Where
фильтровать"...
string[] files11 = Directory.GetFiles(moduleDir, "NVH*.*")//get all files starting with NVH
.Select(path => Path.GetFileName(path))//convert the full paths to filenames only (inc. extensions)
.Where(path => !path.StartsWith("NVHE"))//filter out files that start with NVHE
.ToArray();
Важно отметить, что предложение Where
должно идти после преобразования пути (например, Select
), в противном случае оно будет пытаться соответствовать началу полного пути к файлу (например, "C:\..."
)
А ТАКЖЕ
files11 = files11.Except(files12).ToArray();
Вы можете добавить:
.Where(path => !path.StartsWith("NVHE"))
string[] files11 = Directory.GetFiles(moduleDir, "NVH*.*")
.Select(path => Path.GetFileName(path))
.Where(path => !path.StartsWith("NVHE"))
.ToArray();