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

AEC1 - 18 janv. 2014 à 08:51
 AEC1 - 20 janv. 2014 à 20:59
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

korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
19 janv. 2014 à 11:54
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;
1
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 ! ...
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
19 janv. 2014 à 11:45
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
0
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
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
20 janv. 2014 à 17:42
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.
0
Encore merci pour votre aide et de nouvelles directions à prendre, je vais faire des essais ...

Amitiés, AEC1
0

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

Posez votre question
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
19 janv. 2014 à 07:57
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;
-1
Rejoignez-nous