Comment voir les fichiers que l'on est en train de copîer

vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014 - 2 sept. 2013 à 11:06
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Derniè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;

7 réponses

denisbertin Messages postés 245 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
3 sept. 2013 à 10:43
Visiblement vous programmer avec le langage Pascal

Voici ce que j'ai écrit pour faire une copie de fichier

function File_Copy(entre,sortie:string):boolean;
const taille_buf=100000;
type tbuf=array[1..taille_buf] of Char;
var FromF, ToF: file;
NumRead, NumWritten:Integer;
Buf:tbuf;
begin
{$i+}
File_Copy:=False;
Assign(FromF, entre); { Ouvre entrée }
Reset(FromF, 1); { Taille Record = 1 }
Assign(ToF, sortie); { Ouvre sortie }
Rewrite(ToF, 1); { Taille Record = 1 }
repeat
BlockRead(FromF, Buf, SizeOf(TBuf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
Close(FromF);
Close(ToF);
File_Copy:=NumRead = 0;
{$i-}
end; {File_Copy}
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
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 ....)
0
Merci de ce retour.

Hélas après test, la variable "FromFld" ne contient que la string du dossier source en cours de copie.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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 !
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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...
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
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...
@+
--
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014
6 sept. 2013 à 06:21
Je vais investiguer sur TSHFileopStruct sinon je ferais ceci avec des copyfiles.
Merci à vous.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
9 sept. 2013 à 23:46
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
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...
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par simonpelloquin le 10/09/2013 à 11:54
test : '\\'
'\'
'\'
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
Modifié par simonpelloquin le 10/09/2013 à 11:59
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...)
0
Rejoignez-nous