Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
723 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [DELPHI] copier des fichiers.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DELPHI] copier des fichiers.

n°527043
davidmarli
Posté le 30-09-2003 à 18:46:56  profilanswer
 

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
mood
Publicité
Posté le 30-09-2003 à 18:46:56  profilanswer
 

n°527048
Tetedeienc​h
Head Of God
Posté le 30-09-2003 à 18:58:37  profilanswer
 

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 !
n°527051
Tetedeienc​h
Head Of God
Posté le 30-09-2003 à 19:02:36  profilanswer
 

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 !
n°527070
davidmarli
Posté le 30-09-2003 à 19:19:44  profilanswer
 

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
n°527074
Tetedeienc​h
Head Of God
Posté le 30-09-2003 à 19:22:31  profilanswer
 

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 !
n°527156
davidmarli
Posté le 30-09-2003 à 20:32:29  profilanswer
 

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
n°527215
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-09-2003 à 21:07:11  profilanswer
 

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
n°527219
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-09-2003 à 21:09:24  profilanswer
 

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
n°527389
davidmarli
Posté le 30-09-2003 à 23:11:30  profilanswer
 

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
n°527390
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-09-2003 à 23:13:26  profilanswer
 

MoveFile(Source, Dest) :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 30-09-2003 à 23:13:26  profilanswer
 

n°527395
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-09-2003 à 23:17:16  profilanswer
 

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
n°527428
Tetedeienc​h
Head Of God
Posté le 30-09-2003 à 23:51:36  profilanswer
 

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 !
n°527430
Tetedeienc​h
Head Of God
Posté le 30-09-2003 à 23:52:49  profilanswer
 

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 !
n°527436
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-09-2003 à 23:59:50  profilanswer
 

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
n°527437
Tetedeienc​h
Head Of God
Posté le 01-10-2003 à 00:02:41  profilanswer
 

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 !
n°527438
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 00:03:58  profilanswer
 

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
n°527555
Poipoi
Vive Grumly
Posté le 01-10-2003 à 09:21:25  profilanswer
 

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:
n°527775
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 13:54:10  profilanswer
 

Poipoi a écrit :


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


 
:heink: pourquoi ?

n°527829
Poipoi
Vive Grumly
Posté le 01-10-2003 à 14:57:29  profilanswer
 

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:
n°527869
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 15:40:05  profilanswer
 

: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

n°527875
Poipoi
Vive Grumly
Posté le 01-10-2003 à 15:44:47  profilanswer
 

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:
n°527879
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 15:48:14  profilanswer
 

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

n°527962
davidmarli
Posté le 01-10-2003 à 17:12:08  profilanswer
 

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
n°527995
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 17:35:45  profilanswer
 

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)

n°528009
davidmarli
Posté le 01-10-2003 à 17:44:44  profilanswer
 

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
n°528014
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 17:48:02  profilanswer
 

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)

n°528015
davidmarli
Posté le 01-10-2003 à 17:54:13  profilanswer
 

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
n°528018
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 17:57:06  profilanswer
 

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

n°528019
davidmarli
Posté le 01-10-2003 à 17:59:39  profilanswer
 

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
n°528020
antp
Super Administrateur
Champion des excuses bidons
Posté le 01-10-2003 à 18:02:20  profilanswer
 

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

n°528133
Poipoi
Vive Grumly
Posté le 01-10-2003 à 20:17:28  profilanswer
 

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:
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [DELPHI] copier des fichiers.

 

Sujets relatifs
delphi Bdd Internet[DELPHI] efffacer un répertoire
[DELPHI 7] Installation d'un package ???[delphi] Pb avec le prog ?!?
se logger sur un forum phpbb depuis delphi ?[DELPHI] lecture ficheir AVIavec mediaplayer
[DELPHI]Boutton et track bar... (débutant)[crossplatform] gerer les fichiers et les repertoires
[delphi] utilisation du findComponent dans une fonction if?Fichiers minimum à mettre sur un serveur web
Plus de sujets relatifs à : [DELPHI] copier des fichiers.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR