Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Fabio - Novembre 30, 2011, 10:51:46 am

Titolo: FileSize e dimensione errata
Inserito da: Fabio - Novembre 30, 2011, 10:51:46 am
Come mai la funzione FileSize ritorna una dimensione errata se il file è grosso?

Non sono stato a calcolare il limite di quando sbarella, ma ad esempio file sotto ai 2gb li vede di dimensione giusta, se provo a calcolare la dimensione di un file di 4,53GB me lo vede come fosse 654MB
Titolo: Re:FileSize e dimensione errata
Inserito da: xinyiman - Novembre 30, 2011, 10:56:59 am
Cavolo, non me ne ero mai accorto! Mi sa che questo è da segnalare qui: http://bugs.freepascal.org/view_all_bug_page.php?project_id=1
Titolo: Re:FileSize e dimensione errata
Inserito da: Fabio - Novembre 30, 2011, 11:06:59 am
Fate un po' di prove anche voi se avete tempo, magari sbaglio qualcosa io.
Titolo: Re:FileSize e dimensione errata
Inserito da: Microges2000 - Novembre 30, 2011, 11:34:23 am
Usi FileSize(F:File) oppure FileSize(F:String)

Lo chiedo in quanto la prima (contenuta in system) è l'approccio standard mentre la seconda (contenuta in FileUtil) usa le API del sistema.

Comunque ho fatto un po' di prove (Lazarus 0.9.31 su Windows XP) e funzionano correttamente entrambe a patto di usare:

Per FileUtil.FileSize nessun approccio strano

Per System.FileSize bisogna usare una cosa tipo:

Var
  F : File;
Begin
   AssignFile(F, MioNome);
   Reset(F, 1);
   Dimensione := System.FileSize(F);
   CloseFile(F);
End;
Titolo: Re:FileSize e dimensione errata
Inserito da: Fabio - Novembre 30, 2011, 11:54:15 am
Uso FileSize(string) e ho lazarus 0.9.30 su XP, semmai provo l'altro che hai detto.

grazie.
Titolo: Re:FileSize e dimensione errata
Inserito da: Fabio - Novembre 30, 2011, 02:49:31 pm
Stessa dimensione sbagliata anche usando il metodo che mi hai detto.

Qualcuno che ha la 0.9.30 può confermare che si tratta di un bug?
Titolo: Re:FileSize e dimensione errata
Inserito da: Microges2000 - Novembre 30, 2011, 03:45:21 pm
Controllato. Si è un bug segnalato ora ora
Titolo: Re:FileSize e dimensione errata
Inserito da: Legolas - Novembre 30, 2011, 04:42:04 pm
Siamo sicuri che sia un bug di Lazarus/freepascal e non un bug nel codice dell'utente? Dico questo perché la funzione filesize restituisce un intero a 64 bit.

Ad esempio, a me questo codice funziona benissimo su Lazarus 0.9.30 stabile:

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: int64;
begin
  i:=filesize('C:\dummyfile');
  edit1.Text := IntToStr(i);
end;   

dove dummyfile è un file di più di 4,5 GB. Se proviamo a cambiare la variabile i in un semplice integer (intero a 32 bit) si ottiene un valore vicino ai 600 MB, come lamentato da Fabio
Titolo: Re:FileSize e dimensione errata
Inserito da: Fabio - Novembre 30, 2011, 04:50:21 pm
Perfetto, sbagliavo proprio quello.
Con Int64 funziona giusto.

Grazie.
Titolo: Re:FileSize e dimensione errata
Inserito da: Microges2000 - Dicembre 01, 2011, 08:14:57 am
Si esatto ma anche la funzione IntToStr(FileSize(MioFile)) sbaglia e questo è un errore in quanto IntToStr deve utilizzare 64 bit
Titolo: Re:FileSize e dimensione errata
Inserito da: Legolas - Dicembre 01, 2011, 09:24:47 am
In effetti la funzione IntToStr ha tre varianti:

Codice: [Seleziona]
function IntToStr(Value: integer): string;
function IntToStr(Value: Int64): string;
function IntToStr(Value: QWord): string; 

Il compilatore è abbastanza "furbo" da scegliere quella adeguata al tipo di dato passato come parametro ;)