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")
Indice esempi Prossimo esempio Esempio precedente Indice per argomenti Indice analitico