Programma di esempio LISTDUP.PRT |
; LISTDUP
;
; Programma per Proteus
;
; (C) 2002-2003 Simone Zanella Productions
;
; Questo programma trova i file identici per contenuto nella cartella specificata e visualizza i loro nomi.
#!proteus -z
IF ISEMPTY(ARGV(5))
CONSOLELN "Sintassi: proteus LISTDUP filespec"
CONSOLELN ""
CONSOLELN "Scopo: Trova i file identici per contenuto e li visualizza."
ABORT 0
FI
Path = SplitPath(ARGV(5))
H = DIROPEN(ARGV(5), 1)
F = IIF(NEQ(H, -1), 1, 0)
A = AVLNEW()
WHILE GT(F, 0)
AVLSET(A, DIRLAST(H, 1), ".")
F = DIRNEXT(H)
LOOP
DIRCLOSE(H)
B = AVLNEW()
AVLTRAVERSE(A, Verifica)
AVLTRAVERSE(B, Stampa)
ABORT 0
FUNCTION Stampa(crcdim, L)
IF GT(QUEUELEN(L), 1)
CONSOLELN "Duplicato: " crcdim
WHILE QUEUELEN(L)
CONSOLELN " " DEQUEUE(L)
LOOP
CONSOLELN ""
FI
RETURN 0
FUNCTION Verifica(nome, trash)
lfnsource = _Path nome
crc32 = CalcolaCrc32(nome)
IF AVLBELONG(_B, crc32)
L = AVLGET(_B, crc32)
ENQUEUE(L, nome)
ELSE
L = QUEUENEW()
ENQUEUE(L, nome)
AVLSET(_B, crc32, L)
FI
RETURN 0
FUNCTION SplitPath(pathname)
P = STRRSTR(pathname, "\\")
IF NEQ(P, 0)
RETURN LEFT(pathname, P)
FI
RETURN ""
FUNCTION CalcolaCrc32(nomefile)
; Ritorna crc32 e dimensione file
H = FOPEN(nomefile, 1)
crc32 = 0xFFFFFFFF
WHILE NOT(FEOF(H))
CRC32(FREAD(H, 2048), @crc32)
LOOP
dimensione = FSIZE(H)
FCLOSE(H)
RETURN PADL(PFORMAT("lX", NNOT(crc32)), 8, "0") PADL(dimensione, 10, "0")