Directory.GetFiles с датой в шаблоне имени

У меня проблема с поиском файлов с классом Directory. У меня много файлов с таким названием:

XXX_YYYYMMDD_HHMMSS.

Я хочу перечислить только те файлы, у которых есть имя с датой в этом формате и шаблоны поддержки Directory.GetFiles (), но я не знаю, есть ли шаблон, который позволяет мне отфильтровать, что имя имеет дату в этом формате. Я думал об использовании даты создания или даты модификации, но это не то же самое, что указано в названии, и это то, что мне нужно использовать.

Кто-нибудь знает, как мне помочь? Спасибо!

Есть ли причина, по которой вы не можете фильтровать после, получая имена файлов?

Jon Skeet 17.04.2018 11:24

Потому что в названии указана дата, когда этот файл должен быть обработан ... да ... я знаю ... это очень опасно, но клиент этого хочет и не меняет своего мнения: D

Merendandum 17.04.2018 11:28

Таким образом, вы можете хотя бы отфильтровать дату с помощью буквальной строки ...

DavidG 17.04.2018 11:28

Но для этого нужно создать буквальную дату foreach, не так ли? Я думал на каждой итерации, получить имя и попытаться преобразовать на сегодняшний день. Если это сработает, я могу следить за итерацией ... но я не знаю, лучший ли это способ.

Merendandum 17.04.2018 11:30

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

Jon Skeet 17.04.2018 13:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
856
2

Ответы 2

Предлагаю фильтрацию шагов два:

  1. Подстановочные знаки (необработанная фильтрация) XXX_YYYYMMDD_HHMMSS, где XXX, YYYYMMDD и HHMMSS - некоторые символы
  2. Тонкая фильтрация (Linq), где мы гарантируем, что 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)
Dmitry Bychenko 17.04.2018 11:44

Мне не приходило в голову использовать для этого регулярное выражение. Спасибо!

Merendandum 17.04.2018 11:46

Другие вопросы по теме