[DELPHI] copier des fichiers.

copier des fichiers. [DELPHI] - Delphi/Pascal - Programmation

Marsh Posté le 30-09-2003 à 18:46:56    

Salut,
 
toujours et encore pour mon application,
j'aurais besoin de copier des fichiers d'un réperoire à un autre.
J'ai vu sur le forum que la méthode copyfile, n'est pas très bien.
 
Antp dans un des posts parle de Tfilestream ou de SHFileOperation.
 
Pourriez-vous m'éclairer un peu ?
 
PS : les fichiers à déplacer vont de 1ko à 700 Mo
 
Merci


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 30-09-2003 à 18:46:56   

Reply

Marsh Posté le 30-09-2003 à 18:58:37    

Pourquoi ce serait mal CopyFile ?
 


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 30-09-2003 à 19:02:36    

Sinon, voilà une copie qui devrait marcher :
 

Code :
  1. try
  2.    sStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'source.txt', fmOpenRead);
  3.    dStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'Dest.txt', fmCreate);
  4.    dStream.CopyFrom(sStream, 0);
  5.   finally
  6.     RS.Free;
  7.     dstream.free;
  8.   end;


 
Je l'ai proggué a l'arrache et pas testé, mais ca devrait etre bon.
 
Enfin antp va pas trouver a redire a cette méthode quand même :D


Message édité par Tetedeiench le 30-09-2003 à 23:52:42

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 30-09-2003 à 19:19:44    

euh rassure moi ,je remplace source.txt et dest.txt par mes fichiers !! C'est ça ?


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 30-09-2003 à 19:22:31    

davidmarli a écrit :

euh rassure moi ,je remplace source.txt et dest.txt par mes fichiers !! C'est ça ?


 
Wow, t'as deviné ca tout seul :D
 
Bien sur :)
 
Enfin pour que tu me demandes ca, c'est que tu as pas compris mon code.
 
Comme il est assez basique, tu dois etre encore en période de debut d'apprentissage , nan ?


Message édité par Tetedeiench le 30-09-2003 à 19:23:38

---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 30-09-2003 à 20:32:29    

non en fait ce que je ne comprends pas c'est comment delphi sait-il qu'il doit copier le fichier là où dstream pointe ?
 
qs tu fais  
 
dStream.CopyFrom(sStream, 0);  
 
le 0 correpond à quoi ???
 
merci.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 30-09-2003 à 21:07:11    

tetedeiench a écrit :


 
Enfin antp va pas trouver a redire a cette méthode quand même :D


 
oui, ta méthode fragmente le fichier de destination :p
si on ne précise pas la taille du fichier de destination avant la copie, Windows ne peut pas chercher la zone libre idéale, pouvant contenir le fichier complet.
Il faut faire Dest.Size := Source.Size par exemple... enfin en fat32 c'est un peu chiant parce qu'il remplit parfois tout le fichier de vide. Y a une autre méthode mais je sais plus laquelle  :D
Le CopyFile ou SHFileOperation c'est quand même plus facile [:kiki]
 
et les commentaires genre "free the memory" ça fait un peu débutant qui se sent obligé de mettre des commentaires [:ddr555]
 
puis créer les deux streams avant le try c'est pas malin : si la création du second échoue, le free du premier ne se fait jamais :o
 
bon je crois que j'ai assez critiqué [:figti]


Message édité par antp le 30-09-2003 à 21:10:37

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-09-2003 à 21:09:24    

davidmarli a écrit :

qs tu fais  
 
dStream.CopyFrom(sStream, 0);  
 
le 0 correpond à quoi ???
 
 


 
F1, touche magique :o
 

Citation :

If Count is 0, CopyFrom sets Source position to 0 before reading and then copies the entire contents of Source into the stream. If Count is greater than or less than 0, CopyFrom reads from the current position in Source.


Message édité par antp le 30-09-2003 à 21:09:48

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-09-2003 à 23:11:30    

euh j'ai essayé la méthode, stream dstream ....
ben ça m'a niqué mon fichier que je voualis copier !!!
maintnant il fait 0ko !!! (le source et le destination !!)
Je comprends pas qu'il n'y est pas une fonction toute con pour déplacer un fichier !
genre  
move(source,dest);
 
m'enfin je chercherais mieux demain.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 30-09-2003 à 23:13:26    

MoveFile(Source, Dest) :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-09-2003 à 23:13:26   

Reply

Marsh Posté le 30-09-2003 à 23:17:16    

davidmarli a écrit :


ben ça m'a niqué mon fichier que je voualis copier !!!
maintnant il fait 0ko !!! (le source et le destination !!)
 


 
C'est parce que tetedeiench s'est planté, il a mis un fmCreate au lieu de fmOpenRead pour la source [:ddr555]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-09-2003 à 23:51:36    

antp a écrit :


 
C'est parce que tetedeiench s'est planté, il a mis un fmCreate au lieu de fmOpenRead pour la source [:ddr555]


 
:lol:
 
désolé, je corrige de suite :o


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 30-09-2003 à 23:52:49    

Monsieur antp est content ? /D


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 30-09-2003 à 23:59:50    

rs.free... y a pas de rs déclaré
si tu n'initialise pas tes variables à nil (les variables locales ont des valeurs aléatoires, contrairement aux globales et aux attributs) avant le try et que l'un des deux plante au Create, tu vas aller éventuellement bousiller ta mémoire aléatoirement (je comprends pq ton soft crashe en quittant [:ddr555])
 
Si tu veux pas initialiser tes variables :
 


  sStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'source.txt', fmOpenRead);
 try
   dStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'Dest.txt', fmCreate);
   try
    dStream.CopyFrom(sStream, 0);
   finally
     dstream.free;
   end;
 finally
   sStream.Free;
 end;


C'est lourd mais y a pas tellement d'autres solutions :/


Message édité par antp le 01-10-2003 à 00:00:53

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-10-2003 à 00:02:41    

antp a écrit :

rs.free... y a pas de rs déclaré
si tu n'initialise pas tes variables à nil (les variables locales ont des valeurs aléatoires, contrairement aux globales et aux attributs) avant le try et que l'un des deux plante au Create, tu vas aller éventuellement bousiller ta mémoire aléatoirement (je comprends pq ton soft crashe en quittant [:ddr555])
 
Si tu veux pas initialiser tes variables :
 


  sStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'source.txt', fmOpenRead);
 try
   dStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'Dest.txt', fmCreate);
   try
    dStream.CopyFrom(sStream, 0);
   finally
     dstream.free;
   end;
 finally
   sStream.Free;
 end;


C'est lourd mais y a pas tellement d'autres solutions :/


 
Je te crotte :p :p :p
 
exact pour le rs, je fais pas attention a mes copier/coller ( a l'origine ct pour faire une copie fichier dans ressource => fichier tmp ).
 
mais sinon mon prog plante pu aléatoirement, merci jvcl :jap: Encore un bug :o


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
Reply

Marsh Posté le 01-10-2003 à 00:03:58    

tetedeiench a écrit :


 
mais sinon mon prog plante pu aléatoirement


 
bah oui mais c'est un exemple des bêtes erreurs qui sont vachement difficiles à trouver :/


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-10-2003 à 09:21:25    

antp a écrit :


Si tu veux pas initialiser tes variables :
 


  sStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'source.txt', fmOpenRead);
 try
   dStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'Dest.txt', fmCreate);
   try
    dStream.CopyFrom(sStream, 0);
   finally
     dstream.free;
   end;
 finally
   sStream.Free;
 end;


C'est lourd mais y a pas tellement d'autres solutions :/


suis pas d'accord ya d'autre solution  :whistle:  
si le premier TFileStream.Create plante, le programme se crash :p
 


  try
    sStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'source.txt', fmOpenRead);
     
    try
      dStream := TFileStream.Create(ExtractFilePath(Application.EXEName) + 'Dest.txt', fmCreate);
       
      try
        dStream.CopyFrom(sStream, 0);
      finally
        dstream.free;
      end;
    finally
      sStream.Free;
    end;
  except
    ShowMessage('ereur');
  end;


un truc du genre  :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 01-10-2003 à 13:54:10    

Poipoi a écrit :


si le premier TFileStream.Create plante, le programme se crash :p
 


 
:heink: pourquoi ?

Reply

Marsh Posté le 01-10-2003 à 14:57:29    

antp a écrit :


 
:heink: pourquoi ?


car il rentrera ds le finally du try d'après et plantera sur sStream.Free; avec une jolie erreur mémoire


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 01-10-2003 à 15:40:05    

:heink: n'importe quoi, si le Create file foire il génère une exception, donc il ne continuera pas à la ligne suivante.
D'ailleurs ton code est le même que le mien, t'as juste rajouté un try/except autour ce qui ne change rien au comportement du code en question :p

Reply

Marsh Posté le 01-10-2003 à 15:44:47    

antp a écrit :

:heink: n'importe quoi, si le Create file foire il génère une exception, donc il ne continuera pas à la ligne suivante.
D'ailleurs ton code est le même que le mien, t'as juste rajouté un try/except autour ce qui ne change rien au comportement du code en question :p


oué enfin l'exception est po géré, C mal C tout  :o  
 
 
 
(mauvaise fois inside  [:neowen] )


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 01-10-2003 à 15:48:14    

clair, mauvaise foi, l'exception doit pas spécialement être gérée là, et foutre un showmessage 'erreur' c'est pas malin :p

Reply

Marsh Posté le 01-10-2003 à 17:12:08    

bon je sais je vais commencer à être gonflant, mais ...
 
Votre procedure fonctionne à merveille.
MAIS, comment faire pour avoir la copie de fichier style windows ? Parce que un des fichiers a transférer fait entre 300 et 700 Mo, et donc avec votre procédure, et be nl'utilisateur ne sait jamais combien de temps la copie va prendre.
 
Merci.
 
PS : pourriez-vous me dire ce qui ne va pas dans cette fonction ? Car la plupart du temps, j'ai une erreur me disant de vérifier le fichier source ! Mais sans rien changer si je relance mon prg plusieurs fois la copie se fait !
 
procedure tform1.SHCopyFile(hWndOwner: HWND; const SourceFile, TargetFile: string);
var Info: TSHFileOpStruct;
    Aborted : Bool;
begin
  Aborted := False;
  with Info do
  begin
    Wnd := hWndOwner;
    wFunc := FO_COPY;
 
{ From Microsoft's Help:
  wFunc = Operation to perform. This member can be one of the following values:  
  FO_COPY Copies the files specified by pFrom to the location specified by pTo.
  FO_DELETE Deletes the files specified by pFrom (pTo is ignored).
  FO_MOVE Moves the files specified by pFrom to the location specified by pTo.  
  FO_RENAME Renames the files specified by pFrom. }
 
    pFrom := pChar(SourceFile);  
    pTo := pChar(TargetFile);
    fFlags := 0;  
    fAnyOperationsAborted := Aborted;
  end;  
  try  
    SHFileOperation(Info);
  finally
    if Aborted then; { enact upon any user cancellations }  
  end;
end;


Message édité par davidmarli le 01-10-2003 à 17:28:43

---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 01-10-2003 à 17:35:45    

Initialise tous les champs, ou initialise la structure complète avant d'en remplir des champs (avec FillChar par exemple, en mettant #0 comme caractère)

Reply

Marsh Posté le 01-10-2003 à 17:44:44    

bon j'ai initialiser les champs, pfrom et pto, mais j'obtiens toujours :  
 
Impossible de copier fichier : Impossible de lire à partir du fichier ou de la disquette source .
 
Moi pas trop comprendre pourquoi !
 
sinon qd j'appelle la fonction , je mets cela :  
 
SHCopyFile(application.handle,chemin+'bplay.exe',chemin+'IMAGE_CD\bplay.exe');
 
Merci
 
PS : le pire c'est que si je fais un fileexists(chemin+'bplay.exe'), et ben delphi me dit que le fichier existe bien !!


Message édité par davidmarli le 01-10-2003 à 17:45:37

---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 01-10-2003 à 17:48:02    

davidmarli a écrit :

bon j'ai initialiser les champs, pfrom et pto,


 
T'as pas initialisé TOUS les champs, les autres contiennent des valeurs aléatoires à moins que tu fasses un FillChar(info, SizeOf(info), #0) ou un truc du genre (pas sûr de l'ordre des params)

Reply

Marsh Posté le 01-10-2003 à 17:54:13    

bon effectivement après initialisation ça fonctionne. P##### de fonction.
 
En fait la fonction movefile est pas mal, mais on ne peut pas transférer de fichier d'un disque à un autre !!!
 
c'est pour cela que je voulais une autre fonction.
 
Encore merci.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 01-10-2003 à 17:57:06    

davidmarli a écrit :

P##### de fonction.
 
 


 
Tu lui donnais n'importe quoi dans ses autres params... à mon avis c'est juste le hwnd qui devait être à 0, car les deux autres params que tu n'utilisais pas étaient de toute façon ignorés si les flags appropriés n'étaient pas spécifiés

Reply

Marsh Posté le 01-10-2003 à 17:59:39    

oui possible, en fait comme hwnd, avant je mettais application.handle, et maintenant je mets juste handle. ca change quelque chose ?


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 01-10-2003 à 18:02:20    

j'avais pas vu que tu l'initialisais :o je sais pas ce qu'il faut mettre [:spamafote] c'est bizarre que ça foirait alors :heink: vu que les deux autres params sont normalement ignorés

Reply

Marsh Posté le 01-10-2003 à 20:17:28    

antp a écrit :

et foutre un showmessage 'erreur' c'est pas malin :p


C T juste pour montrer  :o


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed