Differenze tra le versioni di "Ottenere alcune informazioni generali sui file"
Riga 7: | Riga 7: | ||
===Usando la funzione ''stat()'' di C=== | ===Usando la funzione ''stat()'' di C=== | ||
− | 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. | + | Per utilizzare la funzione ''stat()'' di C, bisognerà richiamare la funzione ''[[Stat_()|__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()''. | Dunque, in fase di linking la chiamata a ''stat()'' viene convertita in ''__xstat()''. | ||
Riga 33: | Riga 33: | ||
Private Const _STAT_VER_LINUX as Integer = 1 | Private Const _STAT_VER_LINUX as Integer = 1 | ||
+ | |||
+ | Library "libc:6" | ||
<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 Extern __xstat(ver As Integer, s As String, st As STATUS_File) As Integer | + | Private Extern __xstat(ver As Integer, s As String, st 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 43: | Riga 53: | ||
Dim stS As New STATUS_File | Dim stS As New STATUS_File | ||
Dim i As Integer | Dim i As Integer | ||
+ | Dim at, mt, ct As Long | ||
i = __xstat(_STAT_VER_LINUX, "''/percorso/del/file''", stS) | i = __xstat(_STAT_VER_LINUX, "''/percorso/del/file''", stS) | ||
Riga 58: | Riga 69: | ||
Print .st_blksize | Print .st_blksize | ||
Print .st_blocks | Print .st_blocks | ||
− | + | at = .st_atime | |
− | + | mt = .st_mtime | |
− | + | ct = .st_ctime | |
End With | End With | ||
+ | |||
+ | Print asctime(localtime(VarPtr(at))) | ||
+ | Print asctime(localtime(VarPtr(mt))) | ||
+ | Print asctime(localtime(VarPtr(ct))) | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | ===Usando la funzione ''stat()'' di C mediante una libreria esterna ''ad hoc''=== | ||
+ | La funzione ''stat()'' di C potrà essere utilizzata anche mediante una libreria esterna dinamica e condivisa .so, da noi realizzata, nella quale verrà posta la funzione. | ||
+ | Il codice Gambas, contenente anche una procedura per generare il file sorgente in linguaggio C della libreria esterna condivisa, nonché la libreria medesima .so, sarà il seguente: | ||
+ | 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 | ||
+ | unused2 As Long | ||
+ | st_ctime As Long | ||
+ | __glibc_reserved[3] As Long | ||
+ | End Struct | ||
+ | |||
+ | |||
+ | Library "libc:6" | ||
+ | |||
+ | <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 | ||
+ | |||
+ | Private Extern Chiama_stat(nomefile As String, stFile As STATUS_File) As Integer In "/tmp/libSTATUS" | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim i As Integer | ||
+ | Dim stS As New STATUS_File | ||
+ | Dim at, mt, ct As Long | ||
+ | Dim s As String = "<FONT Color=gray>''/percorso/del/file''</font>" | ||
+ | |||
+ | CreaSo() | ||
+ | |||
+ | i = Chiama_stat(s, stS) | ||
+ | If i <> 0 Then Error.Raise("Errore nella chiamata della funzione 'Chiama_stat()' !") | ||
+ | |||
+ | Print "File controllato: "; s | ||
+ | Print | ||
+ | |||
+ | 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 | ||
+ | End With | ||
+ | |||
+ | Print asctime(localtime(VarPtr(at))) | ||
+ | Print asctime(localtime(VarPtr(mt))) | ||
+ | Print asctime(localtime(VarPtr(ct))) | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Private''' Procedure CreaSo() | ||
+ | |||
+ | <FONT Color=gray>' ''Scriviamo e salviamo il file sorgente in C della libreria condivisa ad hoc:''</font> | ||
+ | File.Save("/tmp/libadhoc.c", "#include <sys/stat.h>" & | ||
+ | "\n\nstruct stat status;" & | ||
+ | "\n\nint Chiama_stat(const char *s, struct stat *st) {" & | ||
+ | "\nint r;" & | ||
+ | "\nr = stat(s, &status);" & | ||
+ | "\n*st = status;" & | ||
+ | "\nreturn r;" & | ||
+ | "\n}") | ||
+ | |||
+ | <FONT Color=gray>' ''Generiamo la libreria condivisa .so ad hoc:''</font> | ||
+ | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | ||
'''End''' | '''End''' |
Versione delle 18:41, 29 mag 2015
Per ottenere alcune informazioni generali sui file, è possibile operare con almeno due risorse.
Usando la funzione Stat() propria di Gambas
Le modalità di utilizzo della funzione di Gambas Stat() è descritta nella seguente pagina.
Usando la funzione stat() di C
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().
Il codice Gambas potrà essere il seguente:
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 __unused2 As Long st_mtime_nsec As Long st_ctime As Long __glibc_reserved[3] As Long End Struct Private Const _STAT_VER_LINUX as Integer = 1 Library "libc:6" ' 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, s As String, st 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 stS As New STATUS_File Dim i As Integer 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 End With Print asctime(localtime(VarPtr(at))) Print asctime(localtime(VarPtr(mt))) Print asctime(localtime(VarPtr(ct))) End
Usando la funzione stat() di C mediante una libreria esterna ad hoc
La funzione stat() di C potrà essere utilizzata anche mediante una libreria esterna dinamica e condivisa .so, da noi realizzata, nella quale verrà posta la funzione. Il codice Gambas, contenente anche una procedura per generare il file sorgente in linguaggio C della libreria esterna condivisa, nonché la libreria medesima .so, sarà il seguente:
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 unused2 As Long st_ctime As Long __glibc_reserved[3] As Long End Struct Library "libc:6" ' 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 Private Extern Chiama_stat(nomefile As String, stFile As STATUS_File) As Integer In "/tmp/libSTATUS" Public Sub Main() Dim i As Integer Dim stS As New STATUS_File Dim at, mt, ct As Long Dim s As String = "/percorso/del/file" CreaSo() i = Chiama_stat(s, stS) If i <> 0 Then Error.Raise("Errore nella chiamata della funzione 'Chiama_stat()' !") Print "File controllato: "; s Print 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 End With Print asctime(localtime(VarPtr(at))) Print asctime(localtime(VarPtr(mt))) Print asctime(localtime(VarPtr(ct))) End Private Procedure CreaSo() ' Scriviamo e salviamo il file sorgente in C della libreria condivisa ad hoc: File.Save("/tmp/libadhoc.c", "#include <sys/stat.h>" & "\n\nstruct stat status;" & "\n\nint Chiama_stat(const char *s, struct stat *st) {" & "\nint r;" & "\nr = stat(s, &status);" & "\n*st = status;" & "\nreturn r;" & "\n}") ' Generiamo la libreria condivisa .so ad hoc: Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait End