Conoscere la dimensione di un file: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 8: Riga 8:
   Dim fl As File
   Dim fl As File
    
    
  fl = Open "''/percorso/del/file''" For Read
  fl = Open "<FONT color=gray>''/percorso/del/file''</font>" For Read
    
    
  Print "La dimensione del file è: "; <FONT color=#B22222>Lof(fl)</font>; " byte"
  Print "La dimensione del file è: "; <FONT color=#B22222>Lof(fl)</font>; " byte"
   
   
  fl.Close
  fl.Close
   
   
  '''End'''
  '''End'''
Riga 25: Riga 25:
   Dim s As String
   Dim s As String
   
   
    s = Stat("''/percorso/del/file''")<FONT color=#B22222>.Size</font>
  s = Stat("<FONT color=gray>''/percorso/del/file''</font>")<FONT color=#B22222>.Size</font>
   
   
    Print "La dimensione del file è: "; s; " byte"
  Print "La dimensione del file è: "; s; " byte"
   
   
  '''End'''
  '''End'''
Riga 38: Riga 38:
   Dim s As String
   Dim s As String
   
   
    s = File.Load("''/percorso/del/file''")
  s = File.Load("<FONT color=gray>''/percorso/del/file''</font>")
   
   
    Print "La dimensione del file è: "; <FONT color=#B22222>Len(s)</font>; " byte"
  Print "La dimensione del file è: "; <FONT color=#B22222>Len(s)</font>; " byte"
   
   
  '''End'''
  '''End'''
Riga 52: Riga 52:
   Dim i As Integer
   Dim i As Integer
   
   
  fl = Open "''/percorso/del/file''" For Read
  fl = Open "<FONT color=gray>''/percorso/del/file''</font>" For Read
   
   
  While Not Eof(fl)
  While Not Eof(fl)
    inc i
    inc i
    Seek #fl, i
    Seek #fl, i
  Wend
  Wend
    
    
  Print "La dimensione del file è: "; i; " byte"
  Print "La dimensione del file è: "; i; " byte"
   
   
  fl.Close
  fl.Close
   
   
  '''End'''
  '''End'''
Riga 74: Riga 74:
   Dim b As Byte
   Dim b As Byte
    
    
  fl = Open "''/percorso/del/file''" For Read
  fl = Open "<FONT color=gray>''/percorso/del/file''</font>" For Read
   
   
  While Not Eof(fl)
  While Not Eof(fl)
    Read #fl, b
    Read #fl, b
    bb.Add(b)
    bb.Add(b)
  Wend
  Wend
    
  Print "La dimensione del file è: "; bb.Count; " byte"
   Print "La dimensione del file è: "; bb.Count; " byte"
   
   
  fl.Close
  fl.Close
   
   
  '''End'''
  '''End'''
o anche così usando il metodo ''Read()'' della variabile vettoriale di tipo Byte[]:
o anche così usando il metodo ''Read()'' della variabile vettoriale di tipo Byte[]:
  '''Public''' Sub Main()
  '''Public''' Sub Main()
Riga 93: Riga 92:
   Dim bb as Byte[]
   Dim bb as Byte[]
    
    
  fl = Open "''/percorso/del/file''"
  fl = Open "<FONT color=gray>''/percorso/del/file''</font>"
   
   
  With bb = New Byte[Lof(fl)]
  With bb = New Byte[Lof(fl)]
    .Read(fl)
    .Read(fl)
  End With
  End With
 
  Print "La dimensione del file è: "; bb.Count; " byte"
  fl.Close
   
   
  Print "La dimensione del file è: "; bb.Count; " byte"
  fl.Close
  '''End'''
  '''End'''


Riga 134: Riga 133:
   Dim l As Long
   Dim l As Long
   
   
  fl = fopen("''/percorso/del/file''", "rb")
  fl = fopen("<FONT color=gray>''/percorso/del/file''</font>", "rb")
  If fl == 0 then Error.raise("Errore !")
      
      
  <FONT Color=gray>' ''Determina la dimensione del file:''</font>
  <FONT Color=gray>' ''Determina la dimensione del file:''</font>
  fseek(fl, 0, SEEK_END)
  fseek(fl, 0, SEEK_END)
  l = ftell(fl)
  l = ftell(fl)
    
    
  Print "Numero di byte nel file: "; l
  Print "Numero di byte nel file: "; l
   
 
  fclose(fl)
  fclose(fl)
   
   
  '''End'''
  '''End'''
Riga 151: Riga 151:


E' necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: "''libgio-2.0''"
E' necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: "''libgio-2.0''"


Mostriamo un semplice esempio pratico:
Mostriamo un semplice esempio pratico:
Riga 180: Riga 179:
   Dim l As Long
   Dim l As Long
    
    
  gf = g_file_new_for_path("<FONT Color=gray>''/percorso/del/file''</font>")
  gf = g_file_new_for_path("<FONT Color=gray>''/percorso/del/file''</font>")
  If gf == 0 then Error.raise("Errore !")
    
    
  gfi = g_file_query_info(gf, "standard::size", G_FILE_QUERY_INFO_NONE, 0, 0)
  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)
  l = g_file_info_get_size(gfi)
  Print l; " byte"
  Print l; " byte"
    
    
  <FONT Color=gray>' ''Libera la memoria utilizzata con la libreria Libgio-2.0:''</font>
  <FONT Color=gray>' ''Libera la memoria utilizzata con la libreria Libgio-2.0:''</font>
  g_object_unref(gfi)
  g_object_unref(gfi)
  g_object_unref(gf)
  g_object_unref(gf)
    
    
  '''End'''
  '''End'''

Versione delle 16:46, 25 dic 2021

Per conoscere la dimensione di un file, si potranno adottare almeno cinque modalità.


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.


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"

Mostriamo un semplice esempio pratico:

Library "libgio-2.0"

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