al.delphi ha scritto:
Curioso, anche con TTask e togliendo qualsiasi riferimento all'UI l'errore del 98% persiste.
Ipotizzo che sia un errore logico.
al.delphi ha scritto:
Di seguito il codice ridotto all'osso: [...]
_pPrj := TDirectory.GetDirectories(pBackupPath, '*', TSearchOption.soAllDirectories);
Delete(_pPrj[i], 1, Length(BackupPath));
Analizzando il codice, vedo apparire un
BackupPath e un
pBackupPath: che differenza c'è tra i due?
Perché ci sono due variabili quasi omonime?
al.delphi ha scritto:
TDirectory.CreateDirectory(ProjectRoot + _pPrj[i]);
Non si combinano i percorsi usando l'operatore "+" come per le stringhe tradizionali: per ogni evenienza, meglio usare .
al.delphi ha scritto:
SetLength(_fBu, 0);
_fBu := TDirectory.GetFiles(pBackupPath, '*.*', TSearchOption.soAllDirectories);
SetLength(_fRel, 0);
_fRel := TDirectory.GetFiles(pBackupPath, '*.*', TSearchOption.soAllDirectories);
for i := 0 to Length(_fBu) - 1 do
begin
Delete(_fRel[i], 1, Length(BackupPath));
_fRel[i] := ProjectRoot + _fRel[i];
TFile.Copy(_fBu[i], _fRel[i]);
end;
end;
In questo pezzo di codice, non mi è chiaro perché tu vada ad acquisire due volte l'elenco dei file, con il pericolo di ottenerlo differente tra le istruzioni se qualcuno sta copiando o spostando un file in quel momento; essendo poi che il percorso di destinazione è determinabile da quello in arrivo (vale lo stesso anche nel tuo codice), basta acquisire il percorso del file originale e valorizzare una variabile con l'equivalente percorso di destinazione partendo dal primo, e poi effettuare la TFile.Copy().
Per dirla meglio, se determini il percorso di destinazione partendo da "fRel" quando questo array contiene gli stessi valori di "fBu", tanto vale partire dal valore originale di "fBu" e determinare direttamente da questo il percorso del file di destinazione, poiché usare l'altra variabile non cambia nulla trattandosi del medesimo valore, e ti basta una variabile stringa per salvare il percorso di destinazione.
Esemplificando velocemente senza cambiare troppo il codice originale:
for i := 0 to Length(_fBu) - 1 do
begin
SourcePath := _fBu[i];
DestPath := SourcePath;
Delete(DestPath, 1, Length(BackupPath));
DestPath := ProjectRoot + DestPath;
TFile.Copy(SourcePath, DestPath);
end;
Mi viene il dubbio di come le directory vengano create prima di copiare i file, e perché questa operazione sia effettivamente necessaria, ma secondo me nel codice persistono dei bug e degli aspetti da approfondire che si potrebbero risolvere facendo un po' di refactoring (es. creando funzioni per i nomi dei file e usando le routine della RTL di gestione dei percorsi per semplificare il lavoro delle stringhe).
Ciao!