Обсуждение программ nnCron и nnCron LITE
by emfs » Fri, 13 Nov 2009, 08:37
Подскажите, как реализовать такое: удалить все файлы в каталоге, кроме одного самого нового?
-
emfs
-
- Posts: 16
- Joined: Sat, 05 Sep 2009, 16:07
by VoidVolker » Fri, 13 Nov 2009, 10:59
- Code: Select all
#( Задача_1051131109 NoActive Action: S" " 0 0 FOR-FILES: "C:\path\*" 2DUP FOUND-FULLPATH FILE-TIME FTIME- 0< \ Сравниваем время создания предыдущего файла с временем создания текущего файла IF \ Текущий файл создан позже предыдущего - его filetime больше 2DROP \ Выкидываем время предыдущего файла DUP IF FDELETE ELSE 2DROP THEN \ И удаляем предыдущий файл. \ (Именно так - чтобы не нагружать лишний раз проц, т.к. FDELETE работает через FOR-FILES) FOUND-FULLPATH SWAP OVER S>ZALLOC SWAP \ Выделяем для строки отдельный буфер, т.к. FOUND-FULLPATH = константа(в течении времени выполнения программы) 2DUP FILE-TIME ELSE \ Текущий файл создан раньше предыдущего FOUND-FULLPATH FDELETE \ Удаляем его за ненадобностью THEN ;FOR-FILES 2DROP 2DROP \ Убираем "мусор" со стека - т.е. время и путь самого последнего созданого файла )#
-

VoidVolker
- Site Admin
-
- Posts: 2928
- Joined: Tue, 25 Apr 2006, 17:56
by progmo » Fri, 20 Nov 2009, 15:26
Подскажите пожалуйста, а как удалить все файлы в папке, кроме созданных сегодня и вчера??? Например задача срабатывает 30 числа Она должна удалить из каталога c:\YYY\ все файлы созданные ранее 29 числа.
-
progmo
-
- Posts: 87
- Joined: Mon, 02 Mar 2009, 17:07
by emfs » Fri, 20 Nov 2009, 16:09
PURGE-OLD
-
emfs
-
- Posts: 16
- Joined: Sat, 05 Sep 2009, 16:07
by progmo » Fri, 20 Nov 2009, 17:52
emfs wrote:PURGE-OLD
Спасибо. В принципе то что надо!
-
progmo
-
- Posts: 87
- Joined: Mon, 02 Mar 2009, 17:07
by AleXH » Wed, 31 May 2017, 20:14
Модифицируйте, пожалуйста, для удаления всех кроме N новых, заданных пользователем в тексте задачи в переменной.
-
AleXH
-
- Posts: 44
- Joined: Sun, 31 Mar 2013, 10:23
by dothen » Wed, 31 May 2017, 21:42
Надо подключить плагин files_pick.spf- Code: Select all
#( task-del-old-files NoActive 2 VALUE frecent : mypath S" d:\path\*.ext" ; Action: \ RECURSIVE \ Посчитать файлы в папке и подпапках (если включать то оба сразу, для подсчета и для поиска). \ С рекурсией тоже останутся только два файла из всех найденных, но не в каждой папке по два. FILESONLY mypath GET-FILE-COUNT PRFILE_COUNT frecent > 0= IF EXIT THEN PRFILE_COUNT frecent - 0 DO \ RECURSIVE \ Искать в папке и подпапках. mypath OLDEST-FILE-TIME FDELETE \ создание \ mypath OLDEST-FILE-ATIME FDELETE \ доступ \ mypath OLDEST-FILE-WTIME FDELETE \ запись LOOP )#
Last edited by dothen on Thu, 01 Jun 2017, 00:57, edited 5 times in total.
-
dothen
-
- Posts: 201
- Joined: Mon, 16 Mar 2015, 04:58
by AleXH » Wed, 31 May 2017, 22:53
Заменил - Code: Select all
5 VALUE frecent : mypath S" d:\TMP\*" ;
на - Code: Select all
2 VALUE frecent : mypath S" d:\path\*.bkp" ;
В папке были 2 файла xxxx.bkp - после исполнения оба были удалены. Предполагалось, что они останутся, а удаляться будут старее чем эти 2. После удаления файлов nnCron загрузил ядро почти на 100%, что-то читая (предположительно пустоту) со скоростью 3.5MB/s.
-
AleXH
-
- Posts: 44
- Joined: Sun, 31 Mar 2013, 10:23
by dothen » Thu, 01 Jun 2017, 00:22
Пример исправил.
Надо выбрать по какому признаку определять возраст файла, по времени создания или по времени последней записи. Например если файл куда-то скопировать и посмотреть свойства файла то время создания станет позднее чем время последней записи.
-
dothen
-
- Posts: 201
- Joined: Mon, 16 Mar 2015, 04:58
by AleXH » Thu, 01 Jun 2017, 09:13
Работает правильно. Чтобы не дублировать код для проверки 2-х разных папок, вынес тело action в процедуру: - Code: Select all
<% : KeepNFiles action_body ; %>
и поместил её перед задачей - nnCron ругается, как я понимаю, на неопределённость mypath, но она инициализируется позже - в задаче ниже. Добавил перед процедурой задачу-объявление переменных: - Code: Select all
#( CLASSIC-TASK-#-VarIni 0 VALUE frecent : mypath S" " ; Action: )#
- теперь не ругается, но и не работает. Передать значения через стек не сумел. Как в таких случаях делать правильно?
-
AleXH
-
- Posts: 44
- Joined: Sun, 31 Mar 2013, 10:23
by dothen » Thu, 01 Jun 2017, 10:16
Если не получается то проще и безопаснее заводить переменную и внутри слова копировать в нее значение со стека. - Code: Select all
<%
2VARIABLE au-str 2 VALUE frecent
: mypath1 ( -- ) S" d:\path\*.ext" ; : mypath2 ( -- ) S" d:\path2\*.ext" ;
\ Или так. \ : mypath1 ( -- ) 2 TO frecent S" d:\path\*.ext" ; \ : mypath2 ( -- ) 5 TO frecent S" d:\path2\*.ext" ;
: del-old-files ( a u -- ) au-str 2! FILESONLY au-str 2@ GET-FILE-COUNT PRFILE_COUNT frecent > 0= IF EXIT THEN PRFILE_COUNT frecent - 0 DO au-str 2@ OLDEST-FILE-TIME FDELETE LOOP ;
%>
#( task-del-old-files NoActive Action: \ 5 TO frecent mypath1 del-old-files \ 3 TO frecent mypath2 del-old-files )#
Можно сделать в отдельных задачах.
-
dothen
-
- Posts: 201
- Joined: Mon, 16 Mar 2015, 04:58
by AleXH » Thu, 01 Jun 2017, 10:41
Спасибо, работает как надо.
-
AleXH
-
- Posts: 44
- Joined: Sun, 31 Mar 2013, 10:23
Return to nnCron forum (Russian)
Who is online
Users browsing this forum: No registered users and 1 guest
|
|