У меня проблема с поиском файлов с классом Directory. У меня много файлов с таким названием:
XXX_YYYYMMDD_HHMMSS.
Я хочу перечислить только те файлы, у которых есть имя с датой в этом формате и шаблоны поддержки Directory.GetFiles (), но я не знаю, есть ли шаблон, который позволяет мне отфильтровать, что имя имеет дату в этом формате. Я думал об использовании даты создания или даты модификации, но это не то же самое, что указано в названии, и это то, что мне нужно использовать.
Кто-нибудь знает, как мне помочь? Спасибо!
Потому что в названии указана дата, когда этот файл должен быть обработан ... да ... я знаю ... это очень опасно, но клиент этого хочет и не меняет своего мнения: D
Таким образом, вы можете хотя бы отфильтровать дату с помощью буквальной строки ...
Но для этого нужно создать буквальную дату foreach, не так ли? Я думал на каждой итерации, получить имя и попытаться преобразовать на сегодняшний день. Если это сработает, я могу следить за итерацией ... но я не знаю, лучший ли это способ.
Пока непонятно, зачем это нужно делать в вызове Directory.GetFiles. Просто выберите все имена файлов, а затем отфильтруйте их.





Предлагаю фильтрацию шагов два:
XXX_YYYYMMDD_HHMMSS, где XXX, YYYYMMDD и HHMMSS - некоторые символыYYYYMMDD_HHMMSS - правильная дата.Что-то вроде этого:
var files = Directory
.EnumerateFiles(@"c:\MyFiles", "*_????????_??????.*") // raw filtering
.Where(file => { // fine filtering
string name = Path.GetFileNameWithoutExtension(file);
// from second last underscope '_'
string at = name.Substring(name.LastIndexOf('_', name.LastIndexOf('_') - 1) + 1);
return DateTime.TryParseExact( // is it a proper date?
at,
"yyyyMMdd'_'HHmmss",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out var _date); })
.ToArray(); // Finally, we want an array
А как насчет использования регулярного выражения? Вероятно, вы могли бы использовать что-то вроде этого:
private static readonly Regex DateFileRegex = new Regex(".*_[0-9]{8}_[\d]{6}.*");
public IEnumerable<string> EnumerateDateFiles(string path)
{
return Directory.EnumerateFiles(path)
.Where(x => this.IsValidDateFile(x));
}
private bool IsValidDateFile(string filename)
{
return DateFileRegex.IsMatch(filename);
}
Шаблон:
.*_[0-9]{8}_[\d]{6}.*
Спички
AHJDJKA_20180417_113028sad.jpg
Например.
Примечание: я не мог проверить код прямо сейчас. Но вы уловили идею.
Regex в порядке, если мы можем гарантировать, что шаблон является правильной датой, в противном случае у нас проблемы с високосные годы и т. д. Например, ABC_20170229_141516.txt не является именем файла действительный (29 Feb 2017)
Мне не приходило в голову использовать для этого регулярное выражение. Спасибо!
Есть ли причина, по которой вы не можете фильтровать после, получая имена файлов?