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

Langage Delphi Discussion :

Concatenation de fichiers


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut Concatenation de fichiers
    Je sais que la question a déjà été posée ici et ailleurs, mais je reste quand même bloqué sur ce problème qui me semblait pourtant très simple au départ.

    Je voudrais sauvegarder quelques clés de registre dans un fichier reg (seulement 4 de toute l'arborescence).

    J'ai créé des fichiers temporaires (sauvegarde de chaque clé dans des fichiers) que je souhaitais donc concaténer en un seul par la suite.

    Le codage des .reg n'étant pas utf-8, je ne pouvais pas utiliser de StringList. J'ai donc opté pour la méthode 'binaire' mais la fonction Blockread pose problème (je développe sous Delphi 2006 - Win7). Erreur E/S 998.

    Aussi, j'ai lu que Blockread était obsolète... le problème ne viendrait-il pas de là ?

    Merci pour votre aide...
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
    var
        i : Integer;
        s : String;
        f1, f2, f3,
        f4, fDest    : File;
        FSize        : Integer;
        StrBuf       : String;
     
     
    begin
        dlgSave.Filter := 'Windows registry file | *.reg';
        dlgSave.InitialDir := '';
        dlgSave.DefaultExt := '.reg';
        dlgSave.Options    := [ofOverwritePrompt,ofHideReadOnly,ofEnableSizing];
        if (dlgSave.Execute = True) then Begin
            // Sauvegarde des clé dans des fichiers temporaires       
    s := dlgSave.FileName + 'tmpEX';
            ShellExecute (0, nil, 'regedit.exe', PChar ('/e "' + s +'" "HKEY_LOCAL_MACHINE\SOFTWARE\M\EX\"'), nil, 0);
            s := dlgSave.FileName + 'tmpDBC';
            ShellExecute (0, nil, 'regedit.exe', PChar ('/e "' + s +'" "HKEY_LOCAL_MACHINE\SOFTWARE\M\DBC\"'), nil, 0);
            s := dlgSave.FileName + 'tmpGR';
            ShellExecute (0, nil, 'regedit.exe', PChar ('/e "' + s +'" "HKEY_LOCAL_MACHINE\SOFTWARE\M\GR\"'), nil, 0);
            s := dlgSave.FileName + 'tmpSYNC';
            ShellExecute (0, nil, 'regedit.exe', PChar ('/e "' + s +'" "HKEY_LOCAL_MACHINE\SOFTWARE\M\Sync\"'), nil, 0);
     
            AssignFile(f1, dlgSave.FileName + 'tmpEX');
            AssignFile(f2, dlgSave.FileName + 'tmpDBC');
            AssignFile(f3, dlgSave.FileName + 'tmpGR');
            AssignFile(f4, dlgSave.FileName + 'tmpSYNC');
            Reset(f1,1);
            Reset(f2,1);
            Reset(f3,1);
            Reset(f4,1);
            AssignFile(FDest, dlgSave.FileName);
            Rewrite(FDest,1);
            FSize := FileSize(f1);
            BlockRead(f1, StrBuf, FSize);
            BlockWrite(fDest, StrBuf, FSize);
            FSize := FileSize(f2);
            BlockRead(f3, StrBuf, FSize);
            BlockWrite(fDest, StrBuf, FSize);
            FSize := FileSize(f3);
            BlockRead(f3, StrBuf, FSize);
            BlockWrite(fDest, StrBuf, FSize);
            FSize := FileSize(f4);
            BlockRead(f4, StrBuf, FSize);
            BlockWrite(fDest, StrBuf, FSize);
     
            CloseFile(f1);
            CloseFile(f2);
            CloseFile(f3);
            CloseFile(f4);
            CloseFile(fDest);
     
            DeleteFile(dlgSave.FileName + 'tmpEX');
            DeleteFile(dlgSave.FileName + 'tmpDBC');
            DeleteFile(dlgSave.FileName + 'tmpGR');
            DeleteFile(dlgSave.FileName + 'tmpSYNC');
        end
    end;

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    J'utilise cette fonction (trouvé sur le forum )

    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
    FUNCTION Fusion_Fichier(Nouveau: STRING; lst_Fichier: TStringList): boolean;
    VAR
        LFileStream, LNewFile: TFileStream;
        i: Integer;
     
    BEGIN
        IF FileExists(Nouveau) THEN
            DeleteFile(PChar(Nouveau));
        // On créer un flux représentant le gros fichier final
        LNewFile := TFileStream.Create(Nouveau, fmCreate);
        TRY
            FOR i := 0 TO lst_Fichier.Count - 1 DO
            BEGIN
                Result := False;
                IF FileExists(lst_Fichier.Strings[i]) THEN
                BEGIN
                    LFileStream := TFileStream.Create(lst_Fichier.Strings[i], fmOpenRead OR fmShareDenyWrite);
                    TRY
                        LFileStream.Position := 0; // Début du flux
                        // On copie dans le gros fichier l'ensemble du petit fichier
                        // C'est la méthode la plus importante de l'algo un petit F1 te donnera tous les détails
                        LNewFile.CopyFrom(LFileStream, LFileStream.Size);
                        Result := True;
                    FINALLY
                        LFileStream.Free;
                    END;
                END; // Fin de IF
            END; // Fin de FOR
        FINALLY
            LNewFile.Free;
        END;
    END; // Fin de FONCTION
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2002
    Messages : 146
    Points : 76
    Points
    76
    Par défaut
    Merci, Olivier, ça fonctionne avec ta méthode

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

Discussions similaires

  1. Concaténer deux fichiers Ligne/Ligne avec SH
    Par guiltouf dans le forum Linux
    Réponses: 7
    Dernier message: 22/05/2007, 14h35
  2. Concaténer plusieurs fichier pdf.
    Par gege2061 dans le forum Linux
    Réponses: 7
    Dernier message: 28/10/2006, 13h14
  3. Supprimer les dernieres lignes et concatener plusieurs fichier
    Par filsdugrand dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 11/04/2006, 21h15
  4. Concaténation de fichiers sous UNIX?
    Par airmax77 dans le forum Linux
    Réponses: 4
    Dernier message: 27/01/2006, 16h23
  5. [Script .BAT] Concatenation de fichiers plats
    Par Jokeur dans le forum Autres langages
    Réponses: 1
    Dernier message: 03/05/2005, 12h14

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