Problema nell'aprire in lettura un file zip

di il
23 risposte

Problema nell'aprire in lettura un file zip

Uso delphi 6 su win. 7. Quando tento di aprire un file .zip di circa 86Mb ottengo l'eccezione: 

Con altri file .zip ottengo lo stesso errore. Ho provato con varie opzioni di fm..... senza risultato.

--------------------------------------------------------------------------------------------

FileStream.Create(NomeFile, fmOpenRead);

Try
  
  .....

Finally
  FreeAndNil(FileStream);
  end;

--------------------------------------------------------------------------------------------

Con questo codice invece non ho alcun errore:

iFileHandle := FileOpen(NomeFile, fmOpenRead);

....
FileClose(iFileHandle);

23 Risposte

  • Re: Problema nell'aprire in lettura un file zip

    Ciao,

    l'immagine con l'errore non si vede.

    Comunque:

    22/02/2026 - franco ha scritto:

    FileStream.Create(NomeFile, fmOpenRead);

    non può funzionare.

    Devi usare questa sintassi, ossia il metodo CREATE della classe (ammesso che la variabile FileSTream sia di tipo TFileStream):

    var FileStream: TFileStream; //da qualche parte nel tuo codice dovrebbe esserci questa dichiarazione
    FileStream := TFileStream.Create(NomeFile, fmOpenRead);
  • Re: Problema nell'aprire in lettura un file zip

    Nel ricopiare ho omesso il FileStream (definito come var TFileStream) davanti l'istruzione: FileStream.Create(NomeFile, fmOpenRead);

    Per cui e' come hai scritto: FileStream:=FileStream.Create(NomeFile, fmOpenRead);

    ma l'errore non cambia.

  • Re: Problema nell'aprire in lettura un file zip

    23/02/2026 - franco ha scritto:

    Nel ricopiare ho omesso il FileStream [...]

    Se fai copia/incolla, senza modifiche manuali, come puoi omettere delle parti?

    Riporta il codice esatto e completo (relativamente alle parti che sono coinvolte e/o significative).

    23/02/2026 - franco ha scritto:

    ma l'errore non cambia.

    In quale riga si verifica l'errore? Si verifica anche con altri file?

    Devi aggiungere dei dettagli, perché così a prima vista, dall'errore che ottieni si tratta banalmente di accesso a un oggetto non inizializzato, o già "distrutto", ma senza ulteriori precisazioni non è possibile dire di più.

  • Re: Problema nell'aprire in lettura un file zip

    var st, NomeFile: String; FileStream: TFilestream; n: Integer;
    ...
    FileStream:=TFileStream.Create(NomeFile, fmOpenRead);
    Try
       n:=FileStream.Size;
       if (n=0) then
          exit;
       st:='';
       SetLength(st,n);
       FileStream.Read(st[1],n);
       // Copia lo stream nella stringa st
    Finally
       FreeAndNil(FileStream);
       end;

    L'errore avviene nel FileStream:=TFileStream.Create(NomeFile, fmOpenRead); quando i file superano all'incirca il Gb (sempre sotto i 2Gb)

    Per cui ho messo un controllo sulla dimensione prima di questo codice risolvendo il problema anche perche' i file cosi' grossi non mi interessano nell'applicazione.

  • Re: Problema nell'aprire in lettura un file zip

    23/02/2026 - franco ha scritto:

    L'errore avviene nel FileStream:=TFileStream.Create(NomeFile, fmOpenRead); quando i file superano all'incirca il Gb (sempre sotto i 2Gb)

    Per cui ho messo un controllo sulla dimensione prima di questo codice risolvendo il problema anche perche' i file cosi' grossi non mi interessano nell'applicazione.

    Se il problema si verifica con file oltre una certa dimensione il problema tendenzialmente non è nel codice, ovvero il problema potrebbe esserlo (ad esempio quando esegui il "Create" ... non testi se il ritorno è NIL o altro valore invalido o se viene generata una eccezione).

    E' molto probabile che con file così grandi tu non abbia le risorse necessarie per gestirlo, ad esempio a causa della frammentazione della memoria oppure legato ad un limite di Delphi 6 (che essendo così vecchio io sinceramente non ho memoria di dettagli).

  • Re: Problema nell'aprire in lettura un file zip

    Condivido la tua analisi, probabilmente e' una questione di risorse di memoria. Uso un Win.7 pro con 4Gb di sdram soli.

    Un utility sulla memoria (window memory cleaner)  mi indica solo un Gbyte di memoria fisica libera, a conferma di cio'. 

  • Re: Problema nell'aprire in lettura un file zip

    23/02/2026 - franco ha scritto:

    L'errore avviene nel FileStream:=TFileStream.Create(NomeFile, fmOpenRead); quando i file superano all'incirca il Gb (sempre sotto i 2Gb)

    E' possibile che la problematica sia legata al fatto che la dimensione del file necessiti di un Longint (64 bit) invece che un 32 bit quale è il tipo Integer di Delphi 6, o che l'API importata da Windows in una versione di Delphi così vecchia non corrisponda con l'esatta firma del metodo che ci si aspetta in Windows 7, che è anch'esso piuttosto vecchio.

    Mi chiedo perché usare una versione così vecchia di Delphi su una versione così vecchia di Windows e con una RAM abbastanza limitata. :|

    23/02/2026 - Delphinium ha scritto:

    E' molto probabile che con file così grandi tu non abbia le risorse necessarie per gestirlo

    Dipende anche da come viene gestito. Con un TFileStream puoi leggere ed elaborare un file anche molto grande, di svariati GB, leggendo/scrivendo un byte alla volta, prescindendo dal quantitativo di RAM che hai a disposizione.

    Per intenderci, con il codice di Franco

    23/02/2026 - franco ha scritto:

    n:=FileStream.Size; if (n=0) then exit; st:=''; SetLength(st,n); FileStream.Read(st[1],n); // Copia lo stream nella stringa st

    il rischio è di non riuscire a elaborare anche file più piccoli di quelli incriminati, visto che fondamentalmente si va a caricare tutto il file in memoria, che è totalmente inefficiente (a quel punto non ha nemmeno senso usare un FileStream).

    23/02/2026 - franco ha scritto:

    probabilmente e' una questione di risorse di memoria

    Probabilmente è qualcos'altro, ma con il codice che hai scritto diventerebbe anche una questione di memoria, ma non per la sua scarsità quanto per il modo in cui viene utilizzata, anche se nel caso in esame - posto che realmente l'errore che riporti si scateni esattamente sulla TFileStream.Create() - la causa probabilmente è legata a limitazioni di bitness e dell'API di Windows importata (parliamo di una versione di Delphi che ha 25 anni).

  • Re: Problema nell'aprire in lettura un file zip

    A parte il linguaggio, MA, a stima:

    st='' // assegna ad st la stringa vuota

    SetLength(st,n) // si assicura che lo spazio disponibile in st possa contenere una stringa di n caratteri (byte?)

    FileStream.Read(st[1],n)  //   st[1] ???  siete sicuri che questo abbia senso ??

  • Re: Problema nell'aprire in lettura un file zip

    24/02/2026 - migliorabile ha scritto:

     siete sicuri che questo abbia senso ??

    Il codice è lecito, poi che abbia senso è un altro argomento.

    L'assegnazione di "st" non è necessaria come non è necessaria la sua allocazione con "SetLength". A differenza del C in Delphi i tipi string sono "managed" e quindi in linea generale non è necessario allocare spazio.

    Poi dipende da dove è derivato questa parte di codice, essendo una estrapolazione (perchè così è solo un esercizio che non ha alcuna utilità) magari quella parte nel suo contesto completo ha un senso.

    La lettura dallo streaming è corretta (la posizione 0 di una variabile string non è accessibile) ma si poteva ommettere scrivendo solo "st" invece di "st[1]" in quanto il compilatore avrebbe generato automaticamente il codice opportuno.

    Poi essendo Delphi 6 veramente datato (si parla di 25 anni fà come accennava @Alka) magari ci sono sfumature che mi sfuggono e quello invece è proprio il codice da usare con le stringhe a quel tempo (ma ne dubito).

    24/02/2026 - migliorabile ha scritto:

    si assicura che lo spazio disponibile in st possa contenere una stringa di n caratteri (byte?)

    Si, in Delphi 6 i tipi string contengono caratteri ad un byte. Non era ancora stato implementato l'UNICODE di default che arriverà solo con la versione Delphi 2009.

  • Re: Problema nell'aprire in lettura un file zip

    Non bastava questo?

    uses
      System.Zip;
    var
      Zip: TZipFile;
    begin
      Zip := TZipFile.Create;
      try
        Zip.Open('C:\file.zip', zmRead);                 Zip.ExtractAll('C:\Destinazione\');
      finally
         Zip.Free;
      end;
    end;

    O mi sono perso.qualcosa?

    Comunque 80 e passa mb sono meno di 1gb.

    O forse anche qui mi sfugge qualcosa.

    In alternativa un ole container e apri la ole.

  • Re: Problema nell'aprire in lettura un file zip

    24/02/2026 - sihsandrea ha scritto:

    Non bastava questo?

    .............

    O mi sono perso.qualcosa?

    Delphi 6 non includeva la classe TZip (che è stata implementata se non sbaglio dopo l'implementazione dell'UNICODE, XE2 mi pare a spanne).

    24/02/2026 - sihsandrea ha scritto:

    Comunque 80 e passa mb sono meno di 1gb.

    O forse anche qui mi sfugge qualcosa.

    Penso sia stato un refuso, anche dopo parlava di file da GB.

  • Re: Problema nell'aprire in lettura un file zip

    24/02/2026 - Delphinium ha scritto:

    Delphi 6 non includeva la classe TZip (che è stata implementata se non sbaglio dopo l'implementazione dell'UNICODE, XE2 mi pare a spanne).

    Mi era sfuggito...

    Nel giurassico non si usava shel o giù di lì?

    Comunque

    23/02/2026 - franco ha scritto:

    FileStream:=FileStream.Create(NomeFile, fmOpenRead);

    FileStream:=TFileStream.Create(NomeFile, fmOpenRead);

    Manca la T

    PS. Ho visto che nel.secondo codice lo hai modificato.

    Per file di grandi dimensioni ed evitare l'accesso violation prova questo esempio di estrazione

    const
      BufferSize = 1024 * 1024;
    var
      Source, Dest: TFileStream;
      Buffer: array[0..BufferSize-1] of Byte;
      BytesRead: Integer;
    begin
      Source := TFileStream.Create('sourcefile.zip', fmOpenRead);
      Dest := TFileStream.Create('destinazio e.zip', fmCreate);
      try
        repeat
           BytesRead := Source.Read(Buffer, BufferSize);
           if BytesRead > 0 then                                         
              Dest.Write(Buffer, BytesRead);                                                                                      
        until BytesRead = 0;                                             
      finally                                                                                           
        Source.Free;
        Dest.Free;                                                                                                
      end;
    end;
  • Re: Problema nell'aprire in lettura un file zip

    Ho chiesto a IA gemini di trasferire il contenuto di un file in una stringa usando delphi 6 ed ho ottenuto 2 codici:

    Appena posso provo il primo. Il secondo metodo e' del tutto simile a quello da me usato e viene dichiarato + efficente.

    Cmq ho provato l'applicazione nel PC della moglie che essendo + recente ha win10 e 8Gb di ram. 

    Anche con i file + grossi zip o no non da alcun errore... sembra sia proprio colpa della scarsa memoria del mio pc.

    grazie cmq dei suggerimenti

    var
      Lista: TStringList;
      Contenuto: string;
    begin
      Lista := TStringList.Create;
      try
        Lista.LoadFromFile('C:\percorso\tuo_file.txt');
        Contenuto := Lista.Text;
      finally
        Lista.Free;
      end;
    end;
    function FileToString(const FileName: string): string;
    var
      Stream: TFileStream;
    begin
      Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
      try
        if Stream.Size > 0 then
        begin
          SetLength(Result, Stream.Size);
          Stream.Read(Result[1], Stream.Size);
        end
        else
          Result := '';
      finally
        Stream.Free;
      end;
    end;
  • Re: Problema nell'aprire in lettura un file zip

    Ultimo accenno:

    anche se in Delphi 6 non ci "dovrebbero" essere problemi a contenere in una stringa dati binari (come quelli di un file .zip), è una pratica che è comunque sconsigliata ... e con il TStringList oltre che sconsigliata ... bhè non ha senso.

    Quei "contenitori" sono stati progettati per contenenere stringhe, ossia caratteri e nelle versioni moderne hanno una serie di funzionalità che non si abbinano bene al contenimento di dati binari.

    Inoltre, nelle versioni moderne una "string" non è un contenitore ad un byte (come l'AnsiString) ma è a due byte (Unicode, UTF-16).

    Per fare ciò che vuoi ti consiglio di usare una array di byte:

    var Buffer: array of byte;
    
    SetLenght(Buffer, Size dello streaming);
Devi accedere o registrarti per scrivere nel forum
23 risposte