copier des fichiers. [DELPHI] - Delphi/Pascal - Programmation
Marsh Posté le 30-09-2003 à 18:58:37
Pourquoi ce serait mal CopyFile ?
Marsh Posté le 30-09-2003 à 19:02:36
Sinon, voilà une copie qui devrait marcher :
Code :
|
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
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 ?
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
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 ?
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.
Marsh Posté le 30-09-2003 à 21:07:11
tetedeiench a écrit : |
oui, ta méthode fragmente le fichier de destination
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
Le CopyFile ou SHFileOperation c'est quand même plus facile
et les commentaires genre "free the memory" ça fait un peu débutant qui se sent obligé de mettre des commentaires
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
bon je crois que j'ai assez critiqué
Marsh Posté le 30-09-2003 à 21:09:24
davidmarli a écrit : qs tu fais |
F1, touche magique
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. |
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.
Marsh Posté le 30-09-2003 à 23:13:26
MoveFile(Source, Dest)
Marsh Posté le 30-09-2003 à 23:17:16
davidmarli a écrit : |
C'est parce que tetedeiench s'est planté, il a mis un fmCreate au lieu de fmOpenRead pour la source
Marsh Posté le 30-09-2003 à 23:51:36
antp a écrit : |
désolé, je corrige de suite
Marsh Posté le 30-09-2003 à 23:52:49
Monsieur antp est content ? /D
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 )
Si tu veux pas initialiser tes variables :
|
C'est lourd mais y a pas tellement d'autres solutions
Marsh Posté le 01-10-2003 à 00:02:41
antp a écrit : rs.free... y a pas de rs déclaré
|
Je te crotte
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 Encore un bug
Marsh Posté le 01-10-2003 à 00:03:58
tetedeiench a écrit : |
bah oui mais c'est un exemple des bêtes erreurs qui sont vachement difficiles à trouver
Marsh Posté le 01-10-2003 à 09:21:25
antp a écrit :
|
suis pas d'accord ya d'autre solution
si le premier TFileStream.Create plante, le programme se crash
|
un truc du genre
Marsh Posté le 01-10-2003 à 13:54:10
ReplyMarsh Posté le 01-10-2003 à 14:57:29
antp a écrit : |
car il rentrera ds le finally du try d'après et plantera sur sStream.Free; avec une jolie erreur mémoire
Marsh Posté le 01-10-2003 à 15:40:05
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
Marsh Posté le 01-10-2003 à 15:44:47
antp a écrit : n'importe quoi, si le Create file foire il génère une exception, donc il ne continuera pas à la ligne suivante. |
oué enfin l'exception est po géré, C mal C tout
(mauvaise fois inside )
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
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;
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)
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 !!
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)
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.
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
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 ?
Marsh Posté le 01-10-2003 à 18:02:20
j'avais pas vu que tu l'initialisais je sais pas ce qu'il faut mettre c'est bizarre que ça foirait alors vu que les deux autres params sont normalement ignorés
Marsh Posté le 01-10-2003 à 20:17:28
antp a écrit : et foutre un showmessage 'erreur' c'est pas malin |
C T juste pour montrer
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