Comment voir les fichiers que l'on est en train de copîer
vieuxpere
Messages postés195Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention17 décembre 2014
-
2 sept. 2013 à 11:06
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 2015
-
10 sept. 2013 à 11:55
Bonjour,
Je suis en train de faire un petit programme de sauvegarde qui utilise la fonction CopyFolder.
Mon problème c'est que parfois j'ai des erreurs de copie parmi les fichiers se trouvant dans mes répertoires en cours de copie.
Aussi, 'ai besoin de savoir quel fichier je suis en train de copier pour pouvoir faire des logs.
Auriez-vous svp une idée ?
Merci par avance.
Voici la fonction utilisée (peut-être faut-il en utiliser une autre) :
function CopyFolder(FromFld, ToFld: string): boolean;
var fos: TSHFileopStruct;
begin
// il faut supprimer les antislashs de fin sinon vous aurez droit à un message d'erreur
FromFld := ExcludeTrailingPathDelimiter(Trim(FromFld));
ToFld := ExcludeTrailingPathDelimiter(Trim(ToFld));
FillChar(fos, SizeOf(fos),0);
with fos do
begin
wFunc := FO_COPY;
pFrom := PChar(FromFld+#0);
pTo := PChar(ToFld+#0);
fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
end;
Result := ShFileOperation(fos)=0;
end;
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 3 sept. 2013 à 16:22
Salut
à priori tu as à chaque fois le nom du fichier dans ta variable FromFld, donc tu peux en faire ce que tu veux au moment ou tu lance cette procédure (showmessage ....)
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 5 sept. 2013 à 10:52
oui M. Dubois, c'est un peu plus compliqué que ça... J'ai bataillé un peu dessus, mais tout est géré par windows... Essaie de fouiller du côté de la propriété lpszProgressTitle du TSHFileopStruct en ajoutant FOF_SIMPLEPROGRESS au FlagsOptions. J'ai essayé mais sans succès... :( Visiblement, la propriété hNameMappings ne s'intéresse qu'aux collisions.
@denisbertin : J'ai une erreur chez moi avec ton code "EInOutError : Accès au fichier refusé" sur le Reset(FromF, 1); (De plus, tu ne réponds pas à la question "Aussi, 'ai besoin de savoir quel fichier je suis en train de copier pour pouvoir faire des logs", mais bon, ça c'est autre chose...)
@tous les deux : utilisez les balises de codes please !
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 5 sept. 2013 à 17:07
Je retire ce que j'ai dit à propos de lpszProgressTitle, ça ne concerne visiblement que le titre de la fenêtre de progression.
Il te faut un balèze de l'API windows...
cs_yanb
Messages postés271Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention 7 juillet 202214 5 sept. 2013 à 11:52
Salut,
en utilisant la fonction fichier par fichier au lieu du répertoire, tu sauras quel fichier et en cours de copie et tu auras la cause de l'erreur si ça plante.
Sinon faire une fonction de copie de fichier et de répertoire et il y en a sur le site...
@+
--
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 5 sept. 2013 à 14:19
oui, mais l'avantage de la classe TSHFileopStruct, c'est que ça copie récursivement... et très simplement...
Dommage qu'il n'y ait pas plus de doc dessus...
Vous n’avez pas trouvé la réponse que vous recherchez ?
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 Modifié par Cirec le 10/09/2013 à 15:33
Salut f0xi,
Je viens de jeter un coup d'oeil à ta source, et je n'arrive pas à la faire fonctionner. Le composant est bien installé (XE2), pas de fuites mémoire, pas de message d'erreur, mais pas de copie non plus... :(
Sûrement que je m'en sers mal. Dis moi ce que t'en penses :
procedure TForm4.Button1Click(Sender: TObject);
var
i : Integer;
begin
with ExtFileOp1 do begin
for i := 0 to FileListBox1.Count - 1 do begin
if FileListBox1.Selected[i]
then Files.Add(DirectoryListBox1.Directory +'\'+ FileListBox1.Items[i]);
end;
Destination := 'D:Users\Simon\Documents\RAD Studio\Projets\Tests\copy f0xi\Test';
if Execute
then ShowMessage('ok'); // Pas de message 'ok'... :(
end;
end;
Simon
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 10 sept. 2013 à 09:54
arf, un "bug" codes sources : entre DirectoryListBox1.Directory et FileListBox1.Items[i], il y a bien sûr un anti-slash...
ouh j'avais pas vu le chemin de destination aussi... merci Buno !
'D:\Users\Simon\Documents\RAD Studio\Projets\Tests\copy f0xi\Test'
(enfin en même temps, ça m'étonnerait que vous ayez le même sur votre poste, mais bon...)