Differenze tra le versioni di "Stat ()"

Da Gambas-it.org - Wikipedia.
Riga 44: Riga 44:
 
e la funzione ''__xstat()'' dichiarata:
 
e la funzione ''__xstat()'' dichiarata:
 
  Private <FONT color=#B22222>Extern __xstat</font>(ver As Integer, filename As String, stat_buf As STATUS_File) As Integer In "<FONT color=#B22222>libc:6</font>"
 
  Private <FONT color=#B22222>Extern __xstat</font>(ver As Integer, filename As String, stat_buf As STATUS_File) As Integer In "<FONT color=#B22222>libc:6</font>"
 +
 +
I membri ''.st_mtime'', ''st_mtime'', ''st_ctime'' della precedente ''Struttura'' restituiscono dei valori numerici che rappresentano ciascuno una data ed un orario. Per convertire tali valori numerici in data e orario, dovremo fare uso delle funzioni di C: ''localtime()'' e ''asctime()''.
  
  
Riga 66: Riga 68:
 
   __glibc_reserved[3] As Long
 
   __glibc_reserved[3] As Long
 
  End Struct
 
  End Struct
 +
 +
 +
Library "libc:6"
 
   
 
   
 
  Private Const _STAT_VER_LINUX as Integer = 1
 
  Private Const _STAT_VER_LINUX as Integer = 1
Riga 71: Riga 76:
 
  <FONT Color=gray>' ''int __xstat (int __ver, const char *__filename, struct stat *__stat_buf)''
 
  <FONT Color=gray>' ''int __xstat (int __ver, const char *__filename, struct stat *__stat_buf)''
 
  ' ''Get file attributes for FILE and put them in BUF.''</font>
 
  ' ''Get file attributes for FILE and put them in BUF.''</font>
  Private <FONT color=#B22222>Extern __xstat</font>(ver As Integer, filename As String, stat_buf As STATUS_File) As Integer In "<FONT color=#B22222>libc:6</font>"
+
  Private <FONT color=#B22222>Extern __xstat</font>(ver As Integer, filename As String, stat_buf As STATUS_File) As Integer
 +
 
 +
<FONT Color=gray>' ''tm* localtime( const time_t *time )''
 +
' ''Converts given time since epoch as time_t value into calendar time, expressed in local time.''</font>
 +
Private Extern localtime(tm As Pointer) As Pointer
 +
 +
<FONT Color=gray>' ''char* asctime( const tm* time_ptr )''
 +
' ''Converts given calendar time tm to a textual representation.''</font>
 +
Private Extern asctime(time_ptr As Pointer) As String
 
   
 
   
 
   
 
   
Riga 78: Riga 91:
 
   Dim i As Integer
 
   Dim i As Integer
 
   Dim stS As New STATUS_File
 
   Dim stS As New STATUS_File
 +
  Dim at, mt, ct As Long
 
    
 
    
 
   i = <FONT color=#B22222>__xstat</font>(_STAT_VER_LINUX, "''/percorso/del/file''", stS)
 
   i = <FONT color=#B22222>__xstat</font>(_STAT_VER_LINUX, "''/percorso/del/file''", stS)
Riga 93: Riga 107:
 
     Print .st_blksize
 
     Print .st_blksize
 
     Print .st_blocks
 
     Print .st_blocks
     Print .st_atime
+
     at = .st_atime
     Print .st_mtime
+
     mt = .st_mtime
     Print .st_ctime
+
     ct = .st_ctime
 +
    Print asctime(localtime(VarPtr(at)))
 +
    Print asctime(localtime(VarPtr(mt)))
 +
    Print asctime(localtime(VarPtr(ct)))
 
   End With
 
   End With
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 04:00, 7 nov 2014

La funzione stat() della libreria di C ritorna alcune informazioni sul file specificato nei suoi parametri.


Per utilizzare la funzione stat() di C, bisognerà richiamare la funzione __xstat(). in quanto, per consentire alla Struttura "struct stat" di variare senza cambiare numero di versione della libreria condivisa .so, il gruppo di funzioni 'stat' sono traslate nelle chiamate alle funzioni 'xstat', 'fxstat', 'lxstat', alle quali è necessario passare come primo argomento il numero-versione che designa la struttura dei dati e i bit utilizzati. Dunque, in fase di linking la chiamata a stat() viene convertita in __xstat().

La definizione e dichiarazione della funzione __xstat() è presente nel file header: sys.stat.h:

int __xstat (int __ver, const char *__filename, struct stat *__stat_buf)

mentre il numero della versione che designa la struttura struct stat dei dati utilizzati è presente nel file header: bits/stat.h:

/* Versions of the `struct stat' data structure.  */
#ifndef __x86_64__
# define _STAT_VER_LINUX_OLD   1
# define _STAT_VER_KERNEL      1
# define _STAT_VER_SVR4        2
# define _STAT_VER_LINUX       3
#else
# define _STAT_VER_KERNEL      0
# define _STAT_VER_LINUX       1
#endif


Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione __xstat() è contenuta. Da sottolineare che bisognerà definire e dichiarare anche la Struttura che si passerà al terzo paramentro della funzione __xstat().


Dunque avremo ad esempio la Struttura dichiarata:

Public Struct STATUS_File
  st_dev As Long
  st_ino As Long
  st_nlink As Long
  st_mode As Integer
  st_uid As Integer
  st_gid As Long
  st_rdev As Long
  st_size As Long
  st_blksize As Long
  st_blocks As Long
  st_atime As Long
  __unused1 As Integer
  st_mtime As Long
  st_mtime_nsec As Long 
  st_ctime As Long
  __glibc_reserved[3] As Long
End Struct

e la funzione __xstat() dichiarata:

Private Extern __xstat(ver As Integer, filename As String, stat_buf As STATUS_File) As Integer In "libc:6"

I membri .st_mtime, st_mtime, st_ctime della precedente Struttura restituiscono dei valori numerici che rappresentano ciascuno una data ed un orario. Per convertire tali valori numerici in data e orario, dovremo fare uso delle funzioni di C: localtime() e asctime().


Semplice esempio di uso in Gambas:

 Public Struct STATUS_File
  st_dev As Long
  st_ino As Long
  st_nlink As Long
  st_mode As Integer
  st_uid As Integer
  st_gid As Long
  st_rdev As Long
  st_size As Long
  st_blksize As Long
  st_blocks As Long
  st_atime As Long
  __unused1 As Integer
  st_mtime As Long
  st_mtime_nsec As Long 
  st_ctime As Long
  __glibc_reserved[3] As Long
End Struct


Library "libc:6"

Private Const _STAT_VER_LINUX as Integer = 1

' int __xstat (int __ver, const char *__filename, struct stat *__stat_buf)
' Get file attributes for FILE and put them in BUF.
Private Extern __xstat(ver As Integer, filename As String, stat_buf As STATUS_File) As Integer
 
' tm* localtime( const time_t *time )
' Converts given time since epoch as time_t value into calendar time, expressed in local time.
Private Extern localtime(tm As Pointer) As Pointer

' char* asctime( const tm* time_ptr )
' Converts given calendar time tm to a textual representation.
Private Extern asctime(time_ptr As Pointer) As String


Public Sub Main()
 
 Dim i As Integer
 Dim stS As New STATUS_File
 Dim at, mt, ct As Long
 
 i = __xstat(_STAT_VER_LINUX, "/percorso/del/file", stS)
 If i < 0 Then Error.Raise("Errore alla funzione '__xstat()' !")

 With stS
   Print .st_dev
   Print .st_ino
   Print .st_nlink
   Print .st_mode
   Print .st_uid
   Print .st_gid
   Print .st_rdev
   Print .st_size; " byte"
   Print .st_blksize
   Print .st_blocks
   at = .st_atime
   mt = .st_mtime
   ct = .st_ctime
   Print asctime(localtime(VarPtr(at)))
   Print asctime(localtime(VarPtr(mt)))
   Print asctime(localtime(VarPtr(ct)))
 End With

End