Построение списка, состоящего из списка файлов, отсортированных по определенному критерию

Суть такова:

  1. Сторонняя программа делает 2 (или более) файла с одинаковой датой создания.
  2. Я своей программой должен прошерстить все директории и получить эти файлы.

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

Допустим есть 4 файла(обозначу их): x1=(invoice1.xml + torg1.xml), x2=(invoice2.xml + torg2.xml). Все эти файлы были созданы в разное время, но в одну дату. Например файлы x1 были созданы 15.10.2021 9:00, а файлы x2 были созданы 15.10.2021 11:00

Что мне нужно:

Получить List<List<string>> из этой директории.. т.е структура List<List<string>> будет следующим

myCollection[0] = List<string> => [0]="invoice1.xml", [1]="torg1"
myCollection[1] = List<string> => [0]="invoice2.xml", [1]="torg2"

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


Ответы (2 шт):

Автор решения: Andrew

тебе необходимо получить метаданные файла - там есть дата сохранения.

Или же воспользоваться методом для получения даты создания или последней модификации файла через его абсолютный путь

DateTime creation = File.GetCreationTime(@"C:\test.txt");
DateTime modification = File.GetLastWriteTime(@"C:\test.txt");

т.е. конечный код будет выглядеть приблизительно так. (код не проверял)

var result = List<List<string>>();

string[] directoryFilesPaths = Directory.GetFiles(targetDirectory);

foreach(string filePath in directoryFilesPaths){
    var creation = File.GetCreationTime(filePath).ToString();

    var fileInfoPair = List<string>() {filePath, creation};
    
    result.add(fileInfoPair);
}

дальше сортируй LINQом как тебе вздумается по любому возможному критерию.

→ Ссылка
Автор решения: Alexander Petrov

Файлы нужно сгруппировать по времени.
Проще всего это сделать с помощью LINQ.

var directoryInfo = new DirectoryInfo(".");

var groupedFiles = directoryInfo
    .EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories)
    .GroupBy(x => x.CreationTime);

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

Вот так понижаем точность до секунд (миллисекунды и тики отбрасываются):

    .GroupBy(x => new DateTime(
            x.CreationTime.Year,
            x.CreationTime.Month,
            x.CreationTime.Day,
            x.CreationTime.Hour,
            x.CreationTime.Minute,
            x.CreationTime.Second));

Можно и дальше понижать точность, задавая 0 вместо x.CreationTime.Second и т. д.


Если нужен непременно список списков, то просто трансформируем группы:

var listOfLists = directoryInfo
    .EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories)
        .GroupBy(x => x.CreationTime)
        .Select(g => g.ToList());

Но это лишняя работа.

→ Ссылка