Comunidad Gambas-es
Stat de corelinux libc en gambas. - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Linux (https://gambas-es.org/forum-9.html)
+--- Foro: Programación en otros lenguajes (https://gambas-es.org/forum-12.html)
+---- Foro: C/C++ (https://gambas-es.org/forum-15.html)
+---- Tema: Stat de corelinux libc en gambas. (/thread-191.html)



Stat de corelinux libc en gambas. - tincho - 13-11-2020

Hola a todos.
Como algunos sabrán la función stat de Gambas no devuelve el inode, no se a que se debe. Este hecho me llevo a investigar el tema y gracias a las enseñanzas del maestro Vuott, que siempre deja ejemplos sobre el uso de Extern y puso un ejemplo de uso de stat de corelinux, convertí eso en una función que si se coloca en un módulo hace lo que el Stat de gambas pero con este parámetro (inode) agregado, pero el caso es que funciona mucho mas rápido para leer los metadatos de un archivo y cuando se trata de miles se nota la diferencia.
Referencia en el foro italiano: Ottenere_alcune_informazioni_generali_sui_file

Código:
Library "libc:6"

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

Private Const _STAT_VER_LINUX As Integer = 1
Private Extern __xstat(_STAT_VER As Integer, __path As String, __statbuf As Stat_) As Integer

'' Create a file parameters list using the GNU coreutils program stat. Note: the tags for access to the information are:<br>
'' Dev, Ino, Path, Link, Mode, SetUID, SetGID, Rdev, Size, BlkSize, Blocks, LastAccess, LastModified, LastChange<br>
'' Original <https://www.gambas-it.org/wiki/index.php?title=Stat_()>

Public Sub Stat(f As String) As Collection

  Dim i As Integer
  Dim st As New Stat_
  Dim inf As New Collection

  i = __xstat(_STAT_VER_LINUX, f, st)
  If i < 0 Then Error.Raise("Function error '__xstat()' !")

  With st
    inf.Add(.st_dev, "Dev")
    inf.Add(.st_ino, "Ino")
    inf.Add(f, "Path")
    inf.Add(.st_nlink, "Link")
    inf.Add(.st_mode, "Mode")
    inf.Add(.st_uid, "SetUID")
    inf.Add(.st_gid, "SetGID")
    inf.Add(.st_rdev, "Rdev")
    inf.Add(.st_size, "Size")
    inf.Add(.st_blksize, "BlkSize")
    inf.Add(.st_blocks, "Blocks")
    inf.Add(.st_atime, "LastAccess")
    inf.Add(.st_mtime, "LastModified")
    inf.Add(.st_ctime, "LastChange")
  End With
  Return inf
End

Saludos.