Как брать самый старый файл (по дате) из директории?

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Всем доброго времени суток. Ребят, прошу помощи - как брать самый старый файл (по дате) из директории? Буду благодарен за любой ответ :3
 

Patcher

Client
Регистрация
06.05.2011
Сообщения
82
Благодарностей
72
Баллы
18
Список файлов в папке находится в списке "Список профилей в папке"
В примере ниже например, самый старый по дате файл из папки PROFILES (из тех что присутствуют в списке) будет записан в переменную old_profile
C#:
IZennoList lst = project.Lists["Список профилей в папке"];

List<string> files = Directory.GetFiles(project.Directory + @"/PROFILES").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
 
  • Спасибо
Реакции: kagorec, lbvf65 и ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Список файлов в папке находится в списке "Список профилей в папке"
В примере ниже например, самый старый по дате файл из папки PROFILES (из тех что присутствуют в списке) будет записан в переменную old_profile
C#:
IZennoList lst = project.Lists["Список профилей в папке"];

List<string> files = Directory.GetFiles(project.Directory + @"/PROFILES").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
Благодарю дружище, сейчас протестирую)
 
  • Спасибо
Реакции: lbvf65

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Список файлов в папке находится в списке "Список профилей в папке"
В примере ниже например, самый старый по дате файл из папки PROFILES (из тех что присутствуют в списке) будет записан в переменную old_profile
C#:
IZennoList lst = project.Lists["Список профилей в папке"];

List<string> files = Directory.GetFiles(project.Directory + @"/PROFILES").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
C#:
IZennoList lst = project.Lists["Список"];

List<string> files = Directory.GetFiles(project.Directory + @"{-Project.Directory-}Профили/Нужные профили/").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
Повторил Ваш код, с нужными мне списками и директориями, но выполняется с ошибкой, в чем я ошибаюсь? Благодарю за ответ

Список и директории условные написал, так-же без {-Project.Directory-} пробовал, разницы нет

Данный список ведет на конечную директорию, то есть поддиректорий там нет, ваш прим. /PROFILES
 
Последнее редактирование:

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 531
Благодарностей
1 324
Баллы
113
C#:
IZennoList lst = project.Lists["Список"];

List<string> files = Directory.GetFiles(project.Directory + @"{-Project.Directory-}Профили/Нужные профили/").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
Повторил Ваш код, с нужными мне списками и директориями, но выполняется с ошибкой, в чем я ошибаюсь? Благодарю за ответ

Список и директории условные написал, так-же без {-Project.Directory-} пробовал, разницы нет
Project.Directory - это папка проекта, а дальше после + это продолжение проекта, что бы быть уверенным, что вы сложили верную дорогу, сложите сначала ее с выводом в лог отдельно.
C#:
return (project.Directory + @"\Профили\Нужные профили\");
Либо попробуйте так сразу:
C#:
IZennoList lst = project.Lists["Список"];

List<string> files = Directory.GetFiles(project.Directory + @"\Профили\Нужные профили\").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
 
Последнее редактирование:
  • Спасибо
Реакции: ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
C#:
IZennoList lst = project.Lists["Список"];

List<string> files = Directory.GetFiles(project.Directory + @"{-Project.Directory-}Профили/Нужные профили/").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
Повторил Ваш код, с нужными мне списками и директориями, но выполняется с ошибкой, в чем я ошибаюсь? Благодарю за ответ

Список и директории условные написал, так-же без {-Project.Directory-} пробовал, разницы нет

Данный список ведет на конечную директорию, то есть поддиректорий там нет, ваш прим. /PROFILES
Лул, мой косяк был в том что не прогнал куб на взятие файлов из нужной директории. В итоге отработал ваш C# сниппет, но взяло не самый старый файл из папки :(
 

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Project.Directory - это папка проекта, а дальше после + это продолжение проекта, что бы быть уверенным, что вы сложили верную дорогу, сложите сначала ее с выводом в лог отдельно.
C#:
return (project.Directory + @"\Профили\Нужные профили\");
Либо попробуйте так сразу:
C#:
IZennoList lst = project.Lists["Список"];

List<string> files = Directory.GetFiles(project.Directory + @"\Профили\Нужные профили\").OrderBy(f => File.GetLastWriteTime(f)).ToList();

lst.AddRange(lst);

project.Variables["old_profile"].Value = lst[0];
Сейчас тестану, спс :-)
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 531
Благодарностей
1 324
Баллы
113
  • Спасибо
Реакции: ruthless

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Спасибо большое, гуглил, но не нашел, запрос иначе вводил.
По примеру из вашего совета (в разборе моего вопроса) нашёл решение, но там выводится в лог, а нужно в переменную.
Тут разбирали ваш вопрос

Что бы быстрее находить ответ, можно попробовать еще так гуглить.
 

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Спасибо большое, гуглил, но не нашел, запрос иначе вводил.
По примеру из вашего совета (в разборе моего вопроса) нашёл решение, но там выводится в лог, а нужно в переменную.
Вопрос исчерпан. Не силен в C#, поэтому пришлось потупить. Прежде чем создавать сниппет, нужно добавить using из этого источника, где таится решение.
Решение:
var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles(@"D:\Рабочий стол").OrderBy(f => f.CreationTime).First();
project.Variables["old_profile"].Value = (oldestFile.Path);
Так-же вариант, что-бы брать из условной папки профилей в директории проекта.
C#:
var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles(project.Directory + @"\Профили\Нужные профили\").OrderBy(f => f.CreationTime).First();
project.Variables["old_profile"].Value = (oldestFile.Path);
 
Последнее редактирование:

Quant

Client
Регистрация
13.12.2016
Сообщения
24
Благодарностей
2
Баллы
3
Так-же вариант, что-бы брать из условной папки профилей в директории проекта.
C#:
var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles(project.Directory + @"\Профили\Нужные профили\").OrderBy(f => f.CreationTime).First();
project.Variables["old_profile"].Value = (oldestFile.Path);
Приветствую. Подскажите как брать самый старый профиль (точнее с самой старой датой его изменения) из неопределенной папки, которая задается во входных настройках проекта?
Условно, чтобы вместо:0
C#:
csharp]var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles(project.Directory + @"\Профили\Нужные профили\")
Было что-то вроде:
C#:
csharp]var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles({-Variable.profiles_dir-})
Также интересна отдельным кубиком проверка "отлежки" профиля (чтобы скрипт проверял что профиль изменялся последний раз более 3 дней назад, например).
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
C#:
// Получим файл с самой старой датой имземения
return new DirectoryInfo(project.Variables["переменная с путем до папки"].Value).GetFiles().OrderBy(x => x.LastWriteTime).FirstOrDefault();

C#:
// Покажем в лог все файлы, дата изменения которых больше 3х дней
var lst = Directory.GetFiles(project.Variables["переменная с путем до папки"].Value).Select(x => new FileInfo(x)).Where(x => x.LastWriteTime < DateTime.Now.AddDays(-3));
foreach(var s in lst) project.SendInfoToLog(s.ToString());
 
  • Спасибо
Реакции: Dan и volody00

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Приветствую. Подскажите как брать самый старый профиль (точнее с самой старой датой его изменения) из неопределенной папки, которая задается во входных настройках проекта?
Условно, чтобы вместо:0
C#:
csharp]var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles(project.Directory + @"\Профили\Нужные профили\")
Было что-то вроде:
C#:
csharp]var oldestFile = CodeProject.FastDirectoryEnumerator.EnumerateFiles({-Variable.profiles_dir-})
Также интересна отдельным кубиком проверка "отлежки" профиля (чтобы скрипт проверял что профиль изменялся последний раз более 3 дней назад, например).
Если не ошибаюсь, тут можно найти ответ: https://zennolab.com/discussion/threads/data-izmenenija-fajla.23367/post-644016
 

Quant

Client
Регистрация
13.12.2016
Сообщения
24
Благодарностей
2
Баллы
3
C#:
// Получим файл с самой старой датой имземения
return new DirectoryInfo(project.Variables["переменная с путем до папки"].Value).GetFiles().OrderBy(x => x.LastWriteTime).FirstOrDefault();

C#:
// Покажем в лог все файлы, дата изменения которых больше 3х дней
var lst = Directory.GetFiles(project.Variables["переменная с путем до папки"].Value).Select(x => new FileInfo(x)).Where(x => x.LastWriteTime < DateTime.Now.AddDays(-3));
foreach(var s in lst) project.SendInfoToLog(s.ToString());
Спасибо, работает!
По поводу проверки отлежки уточню: нужно чтобы код не выводил в лог время отлежки, или количество файлов, соответствующих заданному количеству дней, а было условие вида:
Проверяем дату последнего изменения файла -> если больше Х дней (задается переменной из настроек шаблона) берем в работу, если нет выводим сообщение и завершаем проект.
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
93
Спасибо, работает!
По поводу проверки отлежки уточню: нужно чтобы код не выводил в лог время отлежки, или количество файлов, соответствующих заданному количеству дней, а было условие вида:
Проверяем дату последнего изменения файла -> если больше Х дней (задается переменной из настроек шаблона) берем в работу, если нет выводим сообщение и завершаем проект.
тогда непонятно, зачем тебе нужно получить самый старый файл....
выстраивай логику, с локированием для многопотока, чтобы каждый поток взял исключительно
свой профиль с заданным кол-вом дней от последнего редактирования, без ошибки на повторное взятие этого профиля
 

Quant

Client
Регистрация
13.12.2016
Сообщения
24
Благодарностей
2
Баллы
3
тогда непонятно, зачем тебе нужно получить самый старый файл....
выстраивай логику, с локированием для многопотока, чтобы каждый поток взял исключительно
свой профиль с заданным кол-вом дней от последнего редактирования, без ошибки на повторное взятие этого профиля
Чтобы была возможность выбрать: брать самый старый профиль или профиль определенного возраста/даты изменения.
Брать самый старый профиль - вопрос под конкретную задачу был, а вот уже возможность установить дату изменения тут просто хотелось бы иметь такой кубик, может быть в разных проектах полезен.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)