IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

[D7][WIN32]concaténer deux fichiers


Sujet :

Delphi

  1. #1
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut [D7][WIN32]concaténer deux fichiers
    Salut,
    je voudrais soit insérer des données (octet par octet) en début d'un fichier, soit concaténer deux fichiers. Pour l'instant je fais une copie octet par octet, et ça peut devenir long sur des fichiers de plusieurs Mo.
    Quelqu'un aurait il une idée ?

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Insérer (la vraie insersion) des données en début d'un fichier est impossible; Je m'explique : En fait, il faut créer un nouveau fichier, faire une copie. Par contre, il est possible d'ajouter des nouvelles données à la fin d'un fichier. Jette donc un oeil à la FAQ si tu cherches des exemples de code, tu trouveras tout ce dont tu as besoin. Et n'oubli pas la touche F1, renseigne toi en particulier sur la classe TFileStream... à+

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Hummm... perso je ferai a peu près comme ca ... En améliorant un peu la gestion d'erreur bien entendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    //--------------------------------------------------------------------------//
    // procedure: Append
    // But      : Cette fonction concatene les fichier1 et fichier2 et met le
    //            resultat de cette concatenation dans fichierDest
    //
    // Params   : fichier1    : le fichier qui sera au debut de fichierDest
    //            fichier2    : le fichier qui sera à la fin de fichierDest
    //            fichierDest : le résultat de la concatenation
    //
    // Remarque : Le fichier de destination doit etre différent de ceux d'entrée
    //--------------------------------------------------------------------------//
    procedure TForm1.Append(fichier1, fichier2 : String; fichierDest : String );
      var f1, f2, fdest : File;
          fSize         : Integer;
          buffer        : String;
    begin
     
      if FileExists(fichier1) and FileExists(fichier2) then begin
     
        try
          AssignFile(f1,fichier1);
          AssignFile(f2,fichier2);
          AssignFile(fdest,fichierDest);
          Reset(f1);
          Reset(f2);
          Rewrite(fdest);
          fSize := FileSize(f1);
          BlockRead(f1, buffer, fSize );
          BlockWrite(fdest, buffer, fSize);
          fSize := FileSize(f2);
          BlockRead(f2, buffer, fSize );
          BlockWrite(fdest, buffer, fSize);
        finally
          CloseFile(f1);
          CloseFile(f2);
          CloseFile(fdest);
        end;//try
     
      end else begin
        ShowMessage('Un des fichier spécifiés en entrée n''existe pas');
      end;//if
     
    end;
    Si tu veux écrire octet par octet, au lieu de passer la taille du fichier en entier dans le BlockRead BlockWrite tu met 1 comme taille et tu fais une boucle while not EOF(f1) ... si ca peut t'aider

  4. #4
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    En fait je veux rajouter une entête de fichier bitmap à un fichier quelconque.
    La méthode pour faire l'entête je l'ai et elle est au point.
    Je vais essayer avec les blockread et blockwrite pour voir si c'est plus rapide pour copier le fichier après l'entête.

    question: le TFileStream c'est seulement en .NET, non ?

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 678
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 678
    Points : 7 097
    Points
    7 097
    Par défaut
    Citation Envoyé par Herk77
    question: le TFileStream c'est seulement en .NET, non ?
    Non. Sous D6, je l'ai aussi.

  6. #6
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    J'ai essayé Blockread et blockwrite mais j'ai une interruption : Erreur E/S 998

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Hummm..

    998 :L'accès à cet emplacement de la mémoire n'est pas valide.

    J'ai po eu ce problème dans ma fonction ... ca fait un bail que je l'utilise et je l'ai retestée hier ... Tu lis par block de 1 dans ton fichier la ?

  8. #8
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    J'ai commencé avec la taille du fichier, et après j'ai essayé avec une taille plus petite.

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Et dans les 2 cas tu as l'erreur 998 ?

  10. #10
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    oui, j'ai toujours l'erreur, même avec ton code.
    Ca coince sur le BlockRead.

  11. #11
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Ahh c'est peut etre la facon dont j'ai fait le buffer... Mais c'est etrange que ca marche chez moi J'essayerai de voir ca quand je rentre .. vers 17h

  12. #12
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    J'ai trouvé un tuto de Bodman que j'ai retouché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure Append(fichier1, fichier2: String; fichierDest: String );
    var
      F1, F2, FDst: File;
      lus, ecrit: Integer;
      Buf: array[0..1023] of Char;
    begin
      AssignFile(F1, fichier1);
      Reset(F1,1);
      AssignFile(F2, fichier2);
      Reset(F2,1);
      AssignFile(FDst, fichierDest);
      Rewrite(FDst,1);
      repeat
        BlockRead(F1, Buf, SizeOf(Buf), lus);
        BlockWrite(FDst, Buf, lus, ecrit);
      until (lus = 0) or (ecrit <> lus );
      repeat
        BlockRead(F2, Buf, SizeOf(Buf), lus);
        BlockWrite(FDst, Buf, lus, ecrit);
      until (lus = 0) or (ecrit <> lus );
      CloseFile(F1);
      CloseFile(F2);
      CloseFile(FDst);
    end;
    et ça marche , mais pourquoi ?

  13. #13
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    De plus, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buf: Array[1..1024] of Char;
    c'est plus rapide qu'avec et quelqu'un sait il pourquoi ?

  14. #14
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Points : 86
    Points
    86
    Par défaut
    Je veux pas dire de bêtise. Mais il me semble que dans le premier cas on a un tableau statique et dans le 2eme on a un tableau dynamique. Dans le premier cas, il peut réserver l'espace necessaire a la compilation. Dans le 2eme cas il devra alouer la mémoire sur le tas ce qui est moins rapide.

    En ce qui concerne le code .. ouaip c'est ce que je pensait changer.. mettre un tableau de caractères parce que dans mon cas je ne lui spécifiait aucune taille... c'est etrange d'ailleur que ca marche chez moi

  15. #15
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    Et bien merci pour ton coup de main.
    Cette technique est bien plus rapide pour les gros fichiers que la copie octet par octet. (cela dit c'est logique )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Concaténer deux fichiers
    Par emmachane dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/01/2011, 17h18
  2. Concaténer deux fichiers PDF avec pdftk
    Par serana71 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/04/2010, 11h08
  3. Concaténer deux fichiers PDF
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/04/2010, 12h00
  4. Comment concaténer deux fichiers *.txt ?
    Par thomcat dans le forum Général VBA
    Réponses: 11
    Dernier message: 11/04/2008, 23h47
  5. Concaténer deux fichiers binaires
    Par mickael.be dans le forum Delphi
    Réponses: 7
    Dernier message: 30/07/2006, 13h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo