Conoscere la dimensione di un file
Per conoscere la dimensione di un file, si potranno adottare almeno cinque modalità.
Indice
- 1 Uso della funzione Lof()
- 2 Uso della proprietà .Size della Classe Stat
- 3 Uso della funzione Len()
- 4 Uso della funzione Seek
- 5 Uso della proprietà .Count di un vettore
- 6 Uso della funzione esterna "stat()" di C
- 7 Uso di alcune funzioni della libreria stdio.h di C
- 8 Uso di alcune funzioni esterne del API di Libgio-2.0
Uso della funzione Lof()
La funzone Lof() restituisce proprio la lunghezza in byte di un file:
Public Sub Main() Dim fl As File fl = Open "/percorso/del/file" For Read Print "La dimensione del file è: "; Lof(fl); " byte" fl.Close End
Uso della proprietà .Size della Classe Stat
La Classe Stat restituisce una serie di informazioni relative ai file.
Un esempio può essere il seguente:
Public Sub Button1_Click() Dim s As String s = Stat("/percorso/del/file").Size Print "La dimensione del file è: "; s; " byte" End
Uso della funzione Len()
Useremo la funzione Len() per conoscere la lunghezza della stringa di dati restituita dalla funzione .Load della Classe File:
Public Sub Button1_Click() Dim s As String s = File.Load("/percorso/del/file") Print "La dimensione del file è: "; Len(s); " byte" End
Uso della funzione Seek
Potremo usare anche leggere la quantità di dati contenuti in un file con la funzione Seek, come ad esempio:
Public Sub Main() Dim fl As File Dim i As Integer fl = Open "/percorso/del/file" For Read While Not Eof(fl) inc i Seek #fl, i Wend Print "La dimensione del file è: "; i; " byte" fl.Close End
Uso della proprietà .Count di un vettore
Potremo usare anche la proprietà .Count di un vettore per conoscere - dopo l'intera lettura di un file - la dimensione del file medesimo, come ad esempio:
Public Sub Main() Dim fl As File Dim bb as New Byte[] Dim b As Byte fl = Open "/percorso/del/file" For Read While Not Eof(fl) Read #fl, b bb.Add(b) Wend Print "La dimensione del file è: "; bb.Count; " byte" fl.Close End
o anche così usando il metodo Read() della variabile vettoriale di tipo Byte[]:
Public Sub Main() Dim fl As File Dim bb as Byte[] fl = Open "/percorso/del/file" With bb = New Byte[Lof(fl)] .Read(fl) End With Print "La dimensione del file è: "; bb.Count; " byte" fl.Close End
Uso della funzione esterna "stat()" di C
Si potrà, volendo, utilizzare anche la funzione esterna "stat()" di C con le modalità indicate in questa pagina della Wiki: __xstat().
Uso di alcune funzioni della libreria stdio.h di C
Si potranno, volendo, utilizzare anche alcune funzioni esterne della libreria stdio.h di C, come segue:
Library "libc:6" Private Const SEEK_END As Integer = 2 ' FILE *fopen(const char *path, const char *mode) Private Extern fopen(path As String, mode As String) As Pointer ' int fseek(FILE *stream, long offset, int whence) Private Extern fseek(fs As Pointer, offset As Long, whence As Integer) As Integer ' long ftell(FILE *stream) Private Extern ftell(fs As Pointer) As Long ' int fclose(FILE *stream) Private Extern fclose(fs As Pointer) As Integer Public Sub Main() Dim fl As Pointer Dim l As Long fl = fopen("/percorso/del/file", "rb") If fl == 0 then Error.raise("Errore !") ' Determina la dimensione del file: fseek(fl, 0, SEEK_END) l = ftell(fl) Print "Numero di byte nel file: "; l fclose(fl) End
Uso di alcune funzioni esterne del API di Libgio-2.0
E' possibile utilizzare alcune funzioni esterne del API di Libgio-2.0, in particolare della funzione "g_file_info_get_size()".
E' necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: "libgio-2.0.so.0.6400.6 ".
Mostriamo un semplice esempio pratico:
Library "libgio-2.0:0.6400.6" Private Enum G_FILE_QUERY_INFO_NONE = 0, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS ' GFile * g_file_new_for_path (const char *path) ' Constructs a GFile for a given path. Private Extern g_file_new_for_path(path As String) As Pointer ' GFileInfo * g_file_query_info (GFile *file, const char *attributes, GFileQueryInfoFlags flags, GCancellable *cancellable, GError **error) ' Gets the requested information about specified file. Private Extern g_file_query_info(gfile As Pointer, attributes As String, flags As Integer, cancellable As Pointer, gerror As Pointer) As Pointer ' goffset g_file_info_get_size (GFileInfo *info) ' Gets the file's size. Private Extern g_file_info_get_size(info As Pointer) As Long ' void g_object_unref (gpointer object) ' Decreases the reference count of object. Private Extern g_object_unref(gobject As Pointer) Public Sub Main() Dim gf, gfi As Pointer Dim l As Long gf = g_file_new_for_path("/percorso/del/file") If gf == 0 then Error.raise("Errore !") gfi = g_file_query_info(gf, "standard::size", G_FILE_QUERY_INFO_NONE, 0, 0) If gfi == 0 then Error.raise("Errore !") l = g_file_info_get_size(gfi) Print l; " byte" ' Libera la memoria utilizzata con la libreria Libgio-2.0: g_object_unref(gfi) g_object_unref(gf) End