Удалить всё, кроме одного самого нового

Обсуждение программ nnCron и nnCron LITE

Удалить всё, кроме одного самого нового

Postby emfs » Fri, 13 Nov 2009, 08:37

Подскажите, как реализовать такое: удалить все файлы в каталоге, кроме одного самого нового?
emfs
 
Posts: 16
Joined: Sat, 05 Sep 2009, 16:07

Re: Удалить всё, кроме одного самого нового

Postby 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  \ Убираем "мусор" со стека - т.е. время и путь самого последнего созданого файла
)#
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Удалить всё, кроме одного самого нового

Postby progmo » Fri, 20 Nov 2009, 15:26

Подскажите пожалуйста, а как удалить все файлы в папке, кроме созданных сегодня и вчера???
Например задача срабатывает 30 числа
Она должна удалить из каталога c:\YYY\ все файлы созданные ранее 29 числа.
progmo
 
Posts: 87
Joined: Mon, 02 Mar 2009, 17:07

Re: Удалить всё, кроме одного самого нового

Postby emfs » Fri, 20 Nov 2009, 16:09

PURGE-OLD
emfs
 
Posts: 16
Joined: Sat, 05 Sep 2009, 16:07

Re: Удалить всё, кроме одного самого нового

Postby progmo » Fri, 20 Nov 2009, 17:52

emfs wrote:PURGE-OLD

Спасибо. В принципе то что надо!
progmo
 
Posts: 87
Joined: Mon, 02 Mar 2009, 17:07

Re: Удалить всё, кроме одного самого нового

Postby AleXH » Wed, 31 May 2017, 20:14

Модифицируйте, пожалуйста, для удаления всех кроме N новых, заданных пользователем в тексте задачи в переменной.
AleXH
 
Posts: 44
Joined: Sun, 31 Mar 2013, 10:23

Re: Удалить всё, кроме одного самого нового

Postby 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: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Удалить всё, кроме одного самого нового

Postby 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

Re: Удалить всё, кроме одного самого нового

Postby dothen » Thu, 01 Jun 2017, 00:22

Пример исправил.

Надо выбрать по какому признаку определять возраст файла, по времени создания или по времени последней записи.
Например если файл куда-то скопировать и посмотреть свойства файла то время создания станет позднее чем время последней записи.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Удалить всё, кроме одного самого нового

Postby 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

Re: Удалить всё, кроме одного самого нового

Postby 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: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Удалить всё, кроме одного самого нового

Postby 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: Bing [Bot] and 1 guest