Copier les fichiers d'un répertoire sur un autre support

Signaler
-
 AEC1 -
Bonjour,

voici une procédure de copie qui me pose problème et ou je n'ai pas trouver sur le site l'info qui me convient.

procedure TForm9.Button1Click(Sender: TObject);
begin
if not DirectoryExists('I:\Protocoles') then
begin
if not CreateDir('I:\Protocoles') then
raise Exception.Create('Impossible de créer I:\Protocoles');
end;
Try
///////// si j'utilise la première ligne cela ne marche pas a cause de l'étoile //////
CopyFile('c:\Transanalyses\Protocoles\*.PDF','I:\Protocoles\*.PDF',false);
//////// si je dit pour ce fichier a copier cela fonctionne ///////////////////////////
CopyFile('c:\Transanalyses\Trace.txt','F:\SauvegardeBDT\Trace.txt',false);
Finally
end;
end;

Maintenant je souhaite copier tous les fichiers de ce répertoire vers un autre support et quelque soit le nombre de fichiers contenus dans celui-ci.
Merci a vous pour votre aide SVP.

AEC1

5 réponses

Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Re,

Je ne garantis pas la fiabilité à 100%, en particulier la compatibilité de ShFileOperation avec Vista et ultérieurs, mais si ça peut te dépanner, ou être la base d'une réflexion plus approfondie :

function CopyFolder(FromFolder, ToFolder, ExtMask: string): Boolean;
var
  FOS: TSHFileOpStruct;
begin
  ZeroMemory(@FOS, SizeOf(FOS));
  with FOS do
  begin
    Wnd := Application.Handle;
    wFunc := FO_COPY;
    pFrom := PChar(IncludeTrailingBackSlash(FromFolder) + ExtMask + #0);
    pTo := PChar(ToFolder);
    fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT;
  end;
  Result := (ShFileOperation(FOS) = 0);
end;

Que tu peux donc, dans ton cas, utiliser ainsi :

begin
  if CopyFolder('c:\Transanalyses\Protocoles\*.PDF', 'I:\Protocoles\', '*.pdf') then
    ShowMessage('Fichiers copiés');
end;
Bonjour et merci pour votre aide.
Excuser moi, je n'ai pas tout saisie de votre procédure car le soucis que j'ai ne se pose pas sur la création ou non s'il existe du chemin ou doivent arrivés les fichiers à sauvegarder, mais plutôt dans le fait que je peut avoir un nombre plus important de fichiers à sauvegarder et donc je pensais que de prendre le répertoire d'un bloc et de le copier sur un autre support aurais été plus simple quelque soit le nombre des fichiers contenu dans ce répertoire.
Encore merci pour votre aide.
Amitiés, AEC1

ps: ce que je trouve étonnant c'est que depuis quelques années j'ai été membre inscrit du site sous AEC1 et que je ne suis plus reconnu ! ...
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Salut,

"ce que je trouve étonnant c'est que depuis quelques années j'ai été membre inscrit du site sous AEC1 et que je ne suis plus reconnu !"

Essaye ce lien :
http://codes-sources.commentcamarche.net/profile/user/cs_AEC1
Merci Korgis,
Ok pour les deux lignes de code, mais la ligne function copyfolder ... me met que la valeur de retour de la fonction 'Copyfolder' peut être indéfinie?
Désolé, mais je n'arrive pas à l'exploiter.
AEC1
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Comme je te le suggérais, il s'agit d'une direction à prendre, à toi de l'adapter, de tester le fonctionnement et d'améliorer, mais je pense que c'est vraiment le plus simple de passer par les fonctions de l'API pour les copies de répertoire et de fichiers.
A vérifier si 'ShFileOperation' est toujours dans le coup ou s'il faut remplacer par une instruction plus adaptée aux OS récents (à voir sur MSDN).
Si le compilo te dit que la valeur de retour de 'CopyFolder' peut être indéfinie, rajoute donc en première instruction (de 'CopyFolder') :

Result := False;

De toute manière, la valeur de retour me semble erronnée dans certains cas, mais je n'ai pas le temps de tester plus avant.
Bon courage.
Encore merci pour votre aide et de nouvelles directions à prendre, je vais faire des essais ...

Amitiés, AEC1
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
Salut
Tu peux utiliser un truc comme cela :
1) définir le "chemin" du répertoire
2) créer la liste des fichiers du directory en question
3) avec une boucle FOR copier tous les fichiers

//--------------------------------------------- ListeFILES
procedure TForm1.ListeFILES(var L:TlistBox; ext:string);
var sr:Tsearchrec; e:string;
begin
L.clear;
e := chemin + ext;
findfirst(e,71,sr);
if (sr.name<>'.') and (sr.name<>'..') then L.ADD(sr.name);
while FindNext(sr)=0 do if (sr.name<>'.') and (sr.name<>'..') then L.ADD(sr.name);
end;