Найти последний самый акутальный файл в списке

115
12 июня 2019, 04:00

Никак не могу представить в головке функцию, которая бы обходила файлы сравнивая их имена с DateTime.Now.AddDays(-1).ToShortDateString().ToString() И если не находила, то уменьшала число в AddDays ещё на один. Есть список файлов, который я извлекаю из папки. Все файлы там имеют имена в виде дат(но это не значит, что они загружались именно тогда) 13.12.2018.* - например. Представим, что сейчас самый последний там 5.12.2018. Как извлечь имя самого последнего файла, сравнивая его с маской. Я понимаю, что это должен быть перебор сравнения файлов через форич, и если все результаты фолс - уменьшить ещё на день и повторить.

Answer 1

Алгоритм мне видится следующий:

  1. извлечь имена файлов в список
  2. распарсить дату из имени файла
  3. отсортировать по этой дате в обратном порядке
  4. выбрать первый элемент

А вот код попробуйте написать сами )

UPD:

А, всё-таки, как будет тогда выглядеть такая сортировка?

var lastFileByName = Directory
   .GetFiles(@"C:\temp\", "*.zip")
   .Select(f =>
   {
       DateTime date;
       var n = new FileInfo(f).Name.Replace(".zip", string.Empty);
       return DateTime.TryParseExact(n, "d.M.yyyy", null, DateTimeStyles.None, out date)
           ? new {Date=date, FileName = f}
           : null;
   })
   .Where(it=> it != null)
   .OrderByDescending(it => it.Date)
   .FirstOrDefault()?
   .FileName;
Answer 2

самое простое это вот это. Можно же получить дату создания и изменения файла

DateTime creation = File.GetCreationTime(@"file");
DateTime modification = File.GetLastWriteTime(@"file");

ну и потом отсоритрвоать даты как вам угодно

как то так

 string [] fileEntries = Directory.GetFiles(targetDirectory);
 foreach (var d in fileEntries )
 {
     dates.Add(File.GetLastWriteTime(d));
 }

var result = dates.Order(v => v).Last();
Answer 3

Видимо проблема в том, что ты не знаешь, как парсить дату.

string fileName = "5.9.2018";
DateTime date = DateTime.ParseExact(fileName, "d.M.yyyy", null);

Вообще можно было бы про это и задавать вопрос.

Answer 4

Итог: сделал так, без парссинга даты:

DirectoryInfo directory = new DirectoryInfo(@"C:\temp\");
var ffiles = directory.GetFiles();
string lastDate = "";
int t = 0;
bool check = false;
do
{
foreach (var filesdate in ffiles)
    {
    string inputDate = DateTime.Now.AddDays(t).ToShortDateString().ToString();
    check = inputDate+".zip" == filesdate.Name;
    if (check)
        {
        lastDate = inputDate;
        break;
        }
    }
t = t - 1;
}
while (check != true);

Далее я уже использую lastDate

READ ALSO
SQL группировка по двум полям с условием

SQL группировка по двум полям с условием

помогите составить правильный sql запрос с условием для таблицы статистики посещения к примеру есть таблица

125
Две формы обратной связи в Netcat

Две формы обратной связи в Netcat

Настроил форму обратной связи в Netcat, но задача стоит сделать 2 формы на одной страницеСоздал под каждую свой шаблон но столкнулся с проблемой,...

101