Построение списка, состоящего из списка файлов, отсортированных по определенному критерию
Суть такова:
- Сторонняя программа делает 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 шт):
тебе необходимо получить метаданные файла - там есть дата сохранения.
Или же воспользоваться методом для получения даты создания или последней модификации файла через его абсолютный путь
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ом как тебе вздумается по любому возможному критерию.
Файлы нужно сгруппировать по времени.
Проще всего это сделать с помощью 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());
Но это лишняя работа.