Differenze tra le versioni di "Stat ()"
Riga 19: | Riga 19: | ||
− | 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()''. | + | 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'', avente una dimensione di 144 byte di memoria, che si passerà al terzo paramentro della funzione ''__xstat()''. |
Dunque avremo ad esempio la ''Struttura'' dichiarata: | Dunque avremo ad esempio la ''Struttura'' dichiarata: | ||
− | Public Struct | + | Public Struct stat |
st_dev As Long | st_dev As Long | ||
st_ino As Long | st_ino As Long | ||
Riga 29: | Riga 29: | ||
st_mode As Integer | st_mode As Integer | ||
st_uid As Integer | st_uid As Integer | ||
− | st_gid As | + | st_gid As Integer |
+ | __pad0 As Integer | ||
st_rdev As Long | st_rdev As Long | ||
st_size As Long | st_size As Long | ||
Riga 35: | Riga 36: | ||
st_blocks As Long | st_blocks As Long | ||
st_atime As Long | st_atime As Long | ||
− | + | st_atimensec As Long | |
st_mtime As Long | st_mtime As Long | ||
− | + | st_mtimensec As Long | |
st_ctime As Long | st_ctime As Long | ||
+ | st_ctimensec As Long | ||
__glibc_reserved[3] As Long | __glibc_reserved[3] As Long | ||
End Struct | End Struct | ||
e la funzione ''__xstat()'' dichiarata: | e la funzione ''__xstat()'' dichiarata: | ||
− | Private <FONT color=#B22222>Extern __xstat</font>( | + | Private <FONT color=#B22222>Extern __xstat</font>(_STAT_VER As Integer, __path As String, __statbuf As stat) 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()''. | 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: | Semplice esempio di uso in Gambas: | ||
− | Public Struct | + | Public Struct stat |
st_dev As Long | st_dev As Long | ||
st_ino As Long | st_ino As Long | ||
Riga 56: | Riga 57: | ||
st_mode As Integer | st_mode As Integer | ||
st_uid As Integer | st_uid As Integer | ||
− | st_gid As | + | st_gid As Integer |
+ | __pad0 As Integer | ||
st_rdev As Long | st_rdev As Long | ||
st_size As Long | st_size As Long | ||
Riga 62: | Riga 64: | ||
st_blocks As Long | st_blocks As Long | ||
st_atime As Long | st_atime As Long | ||
− | + | st_atimensec As Long | |
st_mtime As Long | st_mtime As Long | ||
− | + | st_mtimensec As Long | |
st_ctime As Long | st_ctime As Long | ||
+ | st_ctimensec As Long | ||
__glibc_reserved[3] As Long | __glibc_reserved[3] As Long | ||
End Struct | End Struct | ||
Riga 74: | Riga 77: | ||
Private Const _STAT_VER_LINUX as Integer = 1 | Private Const _STAT_VER_LINUX as Integer = 1 | ||
− | <FONT Color=gray>' ''int __xstat ( | + | <FONT Color=gray>' ''int __xstat (_STAT_VER, __path, __statbuf)'' |
' ''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>( | + | Private <FONT color=#B22222>Extern __xstat</font>(_STAT_VER As Integer, __path As String, __statbuf As stat) As Integer |
<FONT Color=gray>' ''tm* localtime( const time_t *time )'' | <FONT Color=gray>' ''tm* localtime( const time_t *time )'' | ||
Riga 90: | Riga 93: | ||
Dim i As Integer | Dim i As Integer | ||
− | Dim | + | Dim st As New stat |
Dim at, mt, ct As Long | Dim at, mt, ct As Long | ||
− | i = <FONT color=#B22222>__xstat</font>(_STAT_VER_LINUX, "''/percorso/del/file''", | + | i = <FONT color=#B22222>__xstat</font>(_STAT_VER_LINUX, "''/percorso/del/file''", st) |
If i < 0 Then Error.Raise("Errore alla funzione '__xstat()' !") | If i < 0 Then Error.Raise("Errore alla funzione '__xstat()' !") | ||
− | With | + | With st |
Print .st_dev | Print .st_dev | ||
Print .st_ino | Print .st_ino |
Versione delle 11:22, 22 mag 2017
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, avente una dimensione di 144 byte di memoria, che si passerà al terzo paramentro della funzione __xstat().
Dunque avremo ad esempio la Struttura dichiarata:
Public Struct stat st_dev As Long st_ino As Long st_nlink As Long st_mode As Integer st_uid As Integer st_gid As Integer __pad0 As Integer st_rdev As Long st_size As Long st_blksize As Long st_blocks As Long st_atime As Long st_atimensec As Long st_mtime As Long st_mtimensec As Long st_ctime As Long st_ctimensec As Long __glibc_reserved[3] As Long End Struct
e la funzione __xstat() dichiarata:
Private Extern __xstat(_STAT_VER As Integer, __path As String, __statbuf As stat) 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 stat st_dev As Long st_ino As Long st_nlink As Long st_mode As Integer st_uid As Integer st_gid As Integer __pad0 As Integer st_rdev As Long st_size As Long st_blksize As Long st_blocks As Long st_atime As Long st_atimensec As Long st_mtime As Long st_mtimensec As Long st_ctime As Long st_ctimensec As Long __glibc_reserved[3] As Long End Struct Library "libc:6" Private Const _STAT_VER_LINUX as Integer = 1 ' int __xstat (_STAT_VER, __path, __statbuf) ' Get file attributes for FILE and put them in BUF. Private Extern __xstat(_STAT_VER As Integer, __path As String, __statbuf As stat) 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 st As New stat Dim at, mt, ct As Long i = __xstat(_STAT_VER_LINUX, "/percorso/del/file", st) If i < 0 Then Error.Raise("Errore alla funzione '__xstat()' !") With st 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 End With Print asctime(localtime(VarPtr(at))) Print asctime(localtime(VarPtr(mt))) Print asctime(localtime(VarPtr(ct))) End