Recuperar información de archivo en Golang

En este artículo, le mostraremos cómo recuperar información de archivos o directorio en Golang. Cuando se trata de seguridad, es muy importante determinar de quién es, cuando fue la última modificación y si el archivo contiene archivos ocultos. Los piratas informáticos hoy en día son conocidos por dejar archivos maliciosos que pueden afectar su computadora.

Para recuperar datos de un archivo, tenemos que utilizar la función os.Stat() que devuelve la información del archivo y recuperar los metadatos. Dicha información se devuelve a través de una estructura FileInfo.

informacionDelArchivo, err := os.Stat("./golang/file_info/espanol/directorio_del_archivo/archivo.txt")
if err != nil {
   log.Fatal(err)
}

Después de recuperar la estructura FileInfo, puede recuperar todas las propiedades adicionales  del archivo. La función Name() devuelve el nombre del archivo.

fmt.Println("Nombre del archivo:     ", informacionDelArchivo.Name())

Size() devuelve el tamaño del archivo en bytes. Para que sea mucho más sencillo, creamos un otro función que devuelve el tamaño del archivo en el formato de cadena. Esa función necesita una variable de la estructura FileInfo y calcula el tamaño y lo devuelve en bytes, kilobytes o megabytes.

func obtenerTamanoDeArchivo(fileInfo fs.FileInfo) string {

   tamano := fileInfo.Size()
   if tamano < 1000 { // El tamaño del archivo está en bytes
      return fmt.Sprintf("%d bytes", tamano)
   } else { // el tamaño del archivo está en kilobytes o megabytes
      tamanoDelArchivoEnKb := float64(tamano) / float64(1000)
      if tamanoDelArchivoEnKb > 1000 { // el tamaño del archivo está en megabytes
         tamanoDelArchivoEnMb := tamanoDelArchivoEnKb / float64(1000)
         return fmt.Sprintf("%d Mb", tamanoDelArchivoEnMb)
      } else { // el tamaño del archivo está en kilobytes
         return fmt.Sprintf("%d Kb", tamanoDelArchivoEnKb)
      }
   }
}

Para determinar el permiso del archivo, tenia que utilizar el función Mode(). Ese función devuelve una estructura FileMode que representa el modo y los bits de permiso de un archivo. No todos los bits se aplican a todos los sistemas operativos.

fmt.Println("Permisos:               ", informacionDelArchivo.Mode())

Para los metadatos de la última modificación, se puede utilizar ModTime() que devuelve la estructura Time.

fmt.Println("Última modificación:    ", informacionDelArchivo.ModTime())

Además de la función getFileSize, creamos un otro para determinar si un archivo es un directorio o no y que devuelve una cadena o no.

func esDirectorio(fileInfo fs.FileInfo) string {
   var resultado = "No"
   if fileInfo.IsDir() {
      resultado = "Sí"
   }
   return resultado
}

El resultado del código en caso de un archivo es lo sigiente:

fmt.Println("|----------- Información del archivo -----------|")
fmt.Println("Nombre del archivo:     ", informacionDelArchivo.Name())
fmt.Println("Tamaño:                 ", obtenerTamanoDeArchivo(informacionDelArchivo))
fmt.Println("Permisos:               ", informacionDelArchivo.Mode())
fmt.Println("Última modificación:    ", informacionDelArchivo.ModTime())
fmt.Println("Es Directorio:          ", esDirectorio(informacionDelArchivo))
fmt.Println("|----------- Información del archivo -----------|\n")

Se ha agregado otro ejemplo, pero este es un ejemplo de directorio:

informacionDelDirectorio, err := os.Stat("./golang/file_info/espanol/directorio_del_archivo")
if err != nil {
   log.Fatal(err)
}
fmt.Println("|----------- Información del directorio -----------|")
fmt.Println("Nombre del archivo:     ", informacionDelDirectorio.Name())
fmt.Println("Tamaño:                 ", obtenerTamanoDeArchivo(informacionDelDirectorio))
fmt.Println("Permisos:               ", informacionDelDirectorio.Mode())
fmt.Println("Última modificación:    ", informacionDelDirectorio.ModTime())
fmt.Println("Es Directorio:          ", esDirectorio(informacionDelDirectorio))
fmt.Println("|----------- Información del directorio -----------|")

Resultado del programa:

|----------- Información del archivo -----------|
Nombre del archivo:      archivo.txt
Tamaño:                  21 bytes
Permisos:                -rw-r--r--
Última modificación:     2022-01-09 17:26:32.816 -0400 AST
Es Directorio:           No
|----------- Información del archivo -----------|

|----------- Información del directorio -----------|
Nombre del archivo:      directorio_del_archivo
Tamaño:                  96 bytes
Permisos:                drwxr-xr-x
Última modificación:     2022-01-11 10:38:01.508373355 -0400 AST
Es Directorio:           Sí
|----------- Información del directorio -----------|

Visite nuestro repositorio de GitHub para el código fuente del proyecto y clone nuestro repositorio para todos los proyectos.

Síguenos:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *