Очистка диска от старых файлов по остатку свободного места

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

Очистка диска от старых файлов по остатку свободного места

Postby Tiktak » Fri, 28 Feb 2014, 18:09

Здравствуйте.

Как очистить папку(и) от старых файлов по условию остатка ннн-ого количества (М),(Г)байт на диске?
Tiktak
 
Posts: 1
Joined: Fri, 28 Feb 2014, 18:06

Re: Очистка диска от старых файлов по остатку свободного мес

Postby Morituruz » Fri, 28 Feb 2014, 22:00

Файлы для удаления случайным образом выбирать будем :D или есть некая папка с подпапками или файлами?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Очистка диска от старых файлов по остатку свободного мес

Postby WAndrey » Mon, 03 Mar 2014, 09:23

А третье слово в вопросе разве не папка? :)
Code: Select all
Action:
  FREE-SPACE: C 10000 <
  IF
    PURGE-OLD: "path\mask" <days>
  THEN

По-моему так (с)
WAndrey
 
Posts: 44
Joined: Fri, 20 May 2011, 10:57

Re: Очистка диска от старых файлов по остатку свободного мес

Postby Morituruz » Mon, 03 Mar 2014, 09:44

В вопросе не указано, внутри папки файлы или папки.
Для второго варианта у меня есть такая задача, пусть адаптирует на свой вкус:
Code: Select all
<%
\ вычисление свободного места через числа двойной длины:
\ lpFreeBytesAvailable [out, optional]
  \ A pointer to a variable that receives the total number of free bytes on a disk that are available to the user who is associated with the calling thread.

\ lpTotalNumberOfBytes [out, optional]
  \ A pointer to a variable that receives the total number of bytes on a disk that are available to the user who is associated with the calling thread.

\ lpTotalNumberOfFreeBytes [out, optional]
  \ A pointer to a variable that receives the total number of free bytes on a disk.

USER-CREATE lpFreeBytesAvailable 2 CELLS USER-ALLOT
USER-CREATE lpTotalNumberOfBytes 2 CELLS USER-ALLOT
USER-CREATE lpTotalNumberOfFreeBytes 2 CELLS USER-ALLOT

: DiskUserFreeSpace lpFreeBytesAvailable 2@ ;
: DiskTotalSpace lpTotalNumberOfBytes 2@ ;
: DiskFreeSpace lpTotalNumberOfFreeBytes 2@ ;

: GetFreeSpace   \ ( az -- d(x x) ) \ Получить объем свободного места в каталоге в байтах, возвращает число двойной длины
  >R lpFreeBytesAvailable lpTotalNumberOfBytes lpTotalNumberOfFreeBytes R> GetDiskFreeSpaceExA DROP
  \ Возвращает размеры в формате ULARGE_INTEGER:
  \ typedef union _ULARGE_INTEGER {
    \ struct {
      \ DWORD LowPart;
      \ DWORD HighPart;
    \ };
    \ struct {
      \ DWORD LowPart;
      \ DWORD HighPart;
    \ } u;
    \ ULONGLONG QuadPart;
  \ } ULARGE_INTEGER, *PULARGE_INTEGER;
  \ Меняем пордядок байтов:
  lpFreeBytesAvailable 2@ SWAP lpFreeBytesAvailable 2!
  lpTotalNumberOfBytes 2@ SWAP lpTotalNumberOfBytes 2!
  lpTotalNumberOfFreeBytes 2@ SWAP lpTotalNumberOfFreeBytes 2!
 
  lpTotalNumberOfFreeBytes 2@
;

: GetFreeSpaceMb   \ ( az -- n ) \ Получить объем свободного места в каталоге в мегабайтах
  GetFreeSpace 0x100000 UM/MOD NIP 
;

: GetFreeSpaceGb   \ ( az -- n ) \ Получить объем свободного места в каталоге в гигабайтах
  GetFreeSpace 0x40000000 UM/MOD NIP 
;

: DiskGetFreeSpace   \ ( char -- d(x x) ) \ Получить объем свободного места в каталоге в байтах, возвращает число двойной длины
  0x005C3A00   \ Строка :\
  OR SP@ GetFreeSpace ROT DROP
;

: DiskGetFreeSpaceMb   \ ( char -- n ) \ Получить объем свободного места в каталоге в мегабайтах
  0x005C3A00
  OR SP@ GetFreeSpaceMb NIP
;

: DiskGetFreeSpaceGb   \ ( char -- n ) \ Получить объем свободного места в каталоге в гигабайтах
  0x005C3A00
  OR SP@ GetFreeSpaceGb NIP
;

: DiskGetFreeSpace:   \ ( " char" -> d(x x) ) \ Получить объем свободного места в каталоге в байтах, возвращает число двойной длины
  BL PARSE DROP C@
  STATE @ IF
    [COMPILE] LITERAL
    POSTPONE DiskGetFreeSpace
  ELSE
    DiskGetFreeSpace
  THEN
; IMMEDIATE

: DiskGetFreeSpaceMb:   \ ( " char" -> n ) \ Получить объем свободного места в каталоге в мегабайтах
  BL PARSE DROP C@
  STATE @ IF
    [COMPILE] LITERAL
    POSTPONE DiskGetFreeSpaceMb
  ELSE
    DiskGetFreeSpaceMb
  THEN
; IMMEDIATE

: DiskGetFreeSpaceGb:   \ ( " char" -> n ) \ Получить объем свободного места в каталоге в гигабайтах
  BL PARSE DROP C@
  STATE @ IF
    [COMPILE] LITERAL
    POSTPONE DiskGetFreeSpaceGb
  ELSE
    DiskGetFreeSpaceGb
  THEN
; IMMEDIATE

: DD*   ( d1 d2 -- d3 )                     \ ZECH named it D*
        >R SWAP >R  ( -- 1L 2L ; R-- 2H 1H )
        2DUP UM*    ( -- 1L 2L d3" )
        ROT         ( -- 1L d3" 2L )
        R> *        ( -- 1L d3" 2L*1H ; R-- 2H )
        +           ( -- 1L d3' )
        ROT R>      ( -- d3' 1L 2H )
        * +     ;   ( -- d3 )

: DD/   ( d1 d2 -- dquot ) D/MOD    2SWAP 2DROP ;

%>

#( delete_old_files
\ 10:26 07.02.2014
\ в пол-пятого каждый день:
Time: 30 4
SingleInstance
VARIABLE docv_dirs
Action:
0 docv_dirs !
\ считаем средний размер папки:
0. \ кладём на стек двойной 0, чтобы с ним складывать
S" g:\*" FOR-FILES
   FOUND-FILENAME S" /^\d{8}$/" RE-MATCH   \ название из 8 цифр?
   IF
      RECURSIVE FOUND-FULLPATH DIR-SIZE D+
      docv_dirs 1+! \ счётчик папок
   THEN
;FOR-FILES
\ считаем среднее арифметическое и сохраняем утроенное значение в переменную (в ГБ):
docv_dirs @ S>D DD/   \ делим на кол-во папок
3. DD*         \ умножаем на 3
1073741824. DD/      \ переводим байты в ГБ
D>S docv_dirs !      \ переводим в сингл и сохраняем
\ CR " average: %docv_dirs @ N>S%" TYPE CR
DiskGetFreeSpaceGb: G docv_dirs @ < \ на диске меньше свободного места чем вычисленное выше тройное среднее:
IF
   S" g:\*" FOR-FILES
      FOUND-FILENAME S" /^\d{8}$/" RE-MATCH   \ название из 8 цифр?
      IF
         DIR-DELETE: "%FOUND-FULLPATH%"
         S" delete " TYPE FOUND-FULLPATH TYPE CR
         DiskGetFreeSpaceGb: G docv_dirs @ >
         IF   \ выходим, если места стало достаточно
            FF-EXIT
         THEN
      THEN
   ;FOR-FILES
THEN
\ CR " %YYYY%.%MM%.%DD% %hh%:%mm%:%ss% end" TYPE CR
)#
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Очистка диска от старых файлов по остатку свободного мес

Postby WAndrey » Mon, 03 Mar 2014, 14:57

Очистить папку от старых файлов. Вроде все четко сказано. Зачем усложнять? :)
WAndrey
 
Posts: 44
Joined: Fri, 20 May 2011, 10:57

Re: Очистка диска от старых файлов по остатку свободного мес

Postby Morituruz » Mon, 03 Mar 2014, 15:01

Моё дело предложить :)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 3 guests

cron