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 :

Problème de fermeture de fichier avec Abrevia


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut Problème de fermeture de fichier avec Abrevia
    Bonjour

    J'utilise Abrevia pour compresser/décompresser des fichiers de collections de bitmaps.
    Il semble que j'ai un problème au niveau de la décompression a savoir qu'une fois le fichier décompressé en mémoire le fichier n'est pas fermé
    Voici la procédure qui permet de décompresser le fichier pour mettre en mémoire mes bitmaps
    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
     
    procedure t_graphisme.remplir(cat: t_cat; chem: string);
    var
      bmp: TBitmap;
      bmps: T4Bitmap;
      Zipper: TAbUnZipper;
      item: TAbArchiveItem;
      MS: TMemoryStream;
      iz, i, cc, ref: integer;
      Bitmap: TBitmap;
      lst: T4Listes;
      nomzip, s, ns: string;
    begin
      lst := getListe(cat);
      for iz := 1 to 4 do
      begin
        nomzip := chem + Format('Z%d.zip', [iz]);
        if fileexists(nomzip) then
        begin
          Zipper := TAbUnZipper.Create(nil);
          try
            Zipper.FileName := chem + Format('Z%d.zip', [iz]);
            for i := 0 to Zipper.Count - 1 do
            begin
              MS := TMemoryStream.Create;
              item := Zipper.items[i];
              try
                Zipper.ExtractToStream(item.FileName, MS);
                s := item.FileName;
                ns := '';
                for cc := 1 to length(s) do
                begin
                  if (s[cc] >= '0') and (s[cc] <= '9') then
                    ns := ns + s[cc];
                end;
                ref := ns.ToInteger;
                bmp := TBitmap.CreateFromStream(MS);
                if not(lst.TryGetValue(ref, bmps)) then
                begin
                  bmps := T4Bitmap.Create;
                  lst.Add(ref, bmps);
                end;
                bmps.bmp[iz] := bmp;
              finally
                MS.free;
              end;
            end;
          finally
            Zipper.Free;
          end;
        end;
      end;
    end;
    J'ai l'impression que Zipper.Free ne libère pas vraiment le fichier à la fin de la décompression car par la suite je n'arrive pas à effacer le fichier zip avec l'instruction deletefile.
    Une idée
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    TAbUnZipper, j'ai utilisé récemment, pas de problème constaté mais je n'utilise pas tout à fait de la même façon
    La différence principale c'est OpenArchive() plutôt que FileName

    Comme je dois justement tester un sujet connexe à cette fonction, je vais regarder la suppression, je n'ai pas essayé, j'ai plutôt écrasé le fichier

    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
     
    const
      ZIP_... = '.......'; // Directement au même niveau que l'exe
    var
      VAbUnZipper: TAbUnZipper;
      VFiles: TArray<string>;
      VFile: string;
      VFileStringStream: TStringStream;
      I, K: Int64;
    ...
      try
        VAbUnZipper := TAbUnZipper.Create(nil);
        try
          VAbUnZipper.OpenArchive(ExtractFilePath( ApplicationExeName ) + ZIP_...);
     
          VFiles := LoadOrder(VAbUnZipper);
     
          K := 0;
          for I := 0 to VAbUnZipper.Count - 1 do
            Inc(K, VAbUnZipper.Items[I].UncompressedSize);
     
          TotalStreamSize := K;
     
          for VFile in VFiles do
          begin
            VFileStringStream := TStringStream.Create('', TEncoding.UTF8);
            try
              VAbUnZipper.ExtractToStream(VFile, VFileStringStream);
     
              Load...(VFile, VFileStringStream.DataString);
     
              CurrentStreamPosition := CurrentStreamPosition + VFileStringStream.Size;
            finally
              VFileStringStream.Free();
            end;
          end;
     
          Result := ...;
        finally
          VAbUnZipper.Free();
        end;
      except
        on E: Exception do
          raise ExceptClass(E.ClassType).CreateFmt('... ... error "%s" during ...', [e.Message]);
      end;
    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
      function LoadOrder(AAbUnZipper: TAbUnZipper): TArray<string>;
      const
        FILE_ORDER = 'xxx.ini';
        SECTION_ORDER = 'yyy';
      var
        I: Integer;
        VFilesAndOrders: TStringList;
        VFileStringStream: TStringStream;
      begin
        I := AAbUnZipper.FindFile(FILE_ORDER);
        if I >= 0 then
        begin
          VFileStringStream := TStringStream.Create('', TEncoding.UTF8);
          try
            AAbUnZipper.ExtractToStream(FILE_ORDER, VFileStringStream);
            VFileStringStream.Seek(0, soBeginning);
     
            with TMemIniFile.Create('') do
            try
              VFilesAndOrders := TStringList.Create();
              try
                VFilesAndOrders.LoadFromStream(VFileStringStream);
                SetStrings(VFilesAndOrders);
              finally
                VFilesAndOrders.Free();
              end;
     
              VFilesAndOrders := TStringList.Create();
              try
                ReadSection(SECTION_ORDER, VFilesAndOrders); // Pas de Valeur
                Result := VFilesAndOrders.ToStringArray();
              finally
                VFilesAndOrders.Free();
              end;
            finally
              Free();
            end;
          finally
            VFileStringStream.Free();
          end;
        end
        else
          raise Exception.CreateFmt('file "%s" missing', [FILE_ORDER]);
      end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    En fait au départ j'écrasai moi aussi les fichiers zip mais j'ai constaté qu'après écrasement le contenu ne changeai pas.
    Du coup je me suis dit j’efface le fichier et ensuite je le reconstruit. Mais l’effacement ne fonctionne pas
    J'ai essayé d'utiliser OpenArchive et CloseArchive mais ça ne fonctionne pas mieux
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Comme prévu, en marge d'un test sur un sujet connexe, j'ai testé, je confirme, cela lit le zip, charge les fichiers (SQL) et je peux supprimer le fichier sans soucis (durant l'exécution des SQL issu du ZIP)
    Le source est au moins aussi vieux que D10 Seattle.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [Python 3.X] fermeture de fichier avec return
    Par robinechuca dans le forum Général Python
    Réponses: 14
    Dernier message: 02/10/2020, 00h00
  2. Ouverture Fermeture de fichiers avec ou sans sauvegarde
    Par Polygos dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/08/2020, 22h34
  3. [XL-2007] Plantage excel à la fermeture du fichier avec macro si autre fichier excel ouvert
    Par Systémicien dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/03/2011, 09h00
  4. Réponses: 0
    Dernier message: 28/05/2009, 18h53
  5. Réponses: 5
    Dernier message: 26/10/2007, 23h45

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