10/09/2025 - sihsandrea ha scritto:
TFileStream alloca 2 GB massimi. Anche se tu hai 16 GB.
La classe TFileStream non alloca GB: si occupa solamente di gestire un handle sul file aperto (con le API di Windows) in modo da poter fare letture, scritture, spostamenti nel file.
Come analogia, si potrebbe pensare a un registratore a cassette: puoi andare all'inizio, alla fine, spostarti a metà, leggere una porzione, scriverne un'altra dalla posizione corrente, ecc.
Può gestire file molto più grandi di 2 GB, infatti la proprietà Size è un Int64, se non ricordo male.
10/09/2025 - sihsandrea ha scritto:
Per capirci viene creato un contenitore con una dimensione ben precisa. Finché c'è capienza ok oltre non va. Es. Int ha meno capienza di longint. A prescindere dalla RAM.
Il contenitore viene creato nel momento in cui si prende la "size" così com'è, e tramite il FileStream si prova a caricare tutti questi dati in un buffer: ovvio che la memoria si esaurisce.
Facendo una metafora, è come se tu dovessi impararti a memoria un intero dizionario di italiano per cercare poi la definizione e il significato di una parola.
Oltre a non avere senso caricare tutti questi dati in generale, lo ha ancora meno in questo scenario, dove materialmente si sta riscrivendo un file sostanzialmente identico all'originale, alterando solamente alcuni byte specifici, ma il discorso si può ampliare a qualunque necessità anche più gravosa in cui - potenzialmente - possono presentarsi file di dimensioni considerevoli.
11/09/2025 - oregon ha scritto:
se operi con una architettura a 64 bit e compili a 64 bit NON dovresti utilizzare un integer ma un Int64 per la Size
Infatti in Delphi la dimensione viene gestita con Int64, come dici tu. E funziona pure con il compilatore 32-bit.
Quello che non va fatto è usare quel valore per dimensionare un buffer di quelle dimensioni. :)