|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 609
|
[C#] Sincronizzare il contenuto di una cartella con quello di un archivio ZIP
Ciao a tutti!
Ieri sera ho scritto una classe per realizzare il backup incrementale di una cartella in formato ZIP (utilizzando l'ottimo DotNetZip di Dino Chiesa ( )), solo che sono rimasto abbastanza deluso dalle prestazioni di ciò che ho fatto.In particolare, usando la cartella del profilo di Thunderbird come test (la mia "pesa" circa 650MB e contiene circa 6500 files e poco più di 80 cartelle totali), il primo backup completo (del peso finale di 340MB) è realizzato in 3 minuti e 23 secondi (e questo dimostra la bontà della libreria DotNetZip, con prestazioni paragonabili ai più noti ZIP engine), mentre i backup successivi, quindi del tipo incrementale, sono completati in circa 2 minuti e 35 secondi per un peso di circa 160MB ciascuno (questo perché basta ricevere solo un'email e Thuderbird modifica il file Inbox del relativo account e quindi va segnato per il backup (in genere è un file piuttosto grande). Bene. Mi sono accorto che durante i backup incrementali, la mia classe perde ben 1 minuto e 17 secondi per determinare (attraverso un ciclo foreach) quali sono i file da includere nel nuovo file ZIP. Ed è qui che, secondo me, perde davvero troppo tempo. Ecco il mio codice, che poi non è nulla di che, ovviamente. Codice:
using (ZipFile NewZip = new ZipFile())
{
P.S: la classe non è ovviamente completa, manca in particolare il controllo di eventuali file eliminati nella cartella origine, che dovrei realizzare con un altro ciclo foreach, e quindi immagino che perderà un altro minuto per il controllo
__________________
L'iPad? Potrebbe esserci gente che, pur d'avere il nuovo gadget, si mette a leggere i libri. Questa sì sarebbe una rivoluzione (Beppe Severgnini)
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Potrei dire una cavolata, ma potresti eseguire l'operazione qui sotto solo una volta, invece che ripeterla 2 volte:
- durante l'assegnazione iniziale di ZipEntry; - nel ramo di esecuzione scelto. Codice:
currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile") Codice:
foreach (FileInfo currentFileOnDisk in FileList)
{
String fileName = currentFileOnDisk.FullName.Replace(mailclientsClass.thunderbirdProfilePath, "ThunderbirdProfile");
ZipEntry candidateZipEntry = OldZip[fileName];
if (candidateZipEntry == null || currentFileOnDisk.LastWriteTimeUtc > candidateZipEntry.ModifiedTime)
NewZip.AddFile(currentFileOnDisk.FullName, Path.GetDirectoryName(fileName));
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 03-11-2009 alle 11:30. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2007
Messaggi: 45
|
|
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 609
|
Quote:
Thanks! Quote:
Inoltre, la versione 1.9 promette grandi passi avanti nelle prestazioni (che già sono assai decorose, comunque) con la compressione e decompressione in parallelo ( http://dotnetzip.codeplex.com/WorkIt...orkItemId=5183 )
__________________
L'iPad? Potrebbe esserci gente che, pur d'avere il nuovo gadget, si mette a leggere i libri. Questa sì sarebbe una rivoluzione (Beppe Severgnini)
|
||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 609
|
Dino Chiesa ha rilasciato una nuova release della versione beta di DotNetZip (la 1.9.0.29).
Dire "eccezionale" sarebbe riduttivo Con la compressione in parallelo e il BufferSize impostato a 131072 (ovvero 128KB), il mio programma ha ridotto i tempi di compressione di circa l'80%. Per comprimere la stessa cartella del profilo di Thunderbird, ora impiega appena 1 minuto e 52 secondi (con la vecchia versione della libreria, e senza il BufferSize impostato a 128KB, impiegava circa 3 minuti e 23 secondi). E devo ancora provare gli altri consigli che mi ha dato! Provatela anche voi! http://dotnetzip.codeplex.com/Releas...eleaseId=27890
__________________
L'iPad? Potrebbe esserci gente che, pur d'avere il nuovo gadget, si mette a leggere i libri. Questa sì sarebbe una rivoluzione (Beppe Severgnini)
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 609
|
Inoltre, stavo pensando anche di impiegare un db come SQLite per creare un catalogo che tenga traccia degli ultimi file modificati, così non ho bisogno di controllare ogni file ZIP. Non vedo l'ora di provare tutte queste modifiche...
__________________
L'iPad? Potrebbe esserci gente che, pur d'avere il nuovo gadget, si mette a leggere i libri. Questa sì sarebbe una rivoluzione (Beppe Severgnini)
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:58.










)), solo che sono rimasto abbastanza deluso dalle prestazioni di ciò che ho fatto.










