Información de un archivo en Rust

Una sola llamada, fs::metadata, devuelve todo lo que el sistema sabe de un archivo: tamaño, tipo, permisos y fechas. Es el equivalente de lo que muestran las propiedades del explorador.

Consultar los metadatos

use std::fs;

fn main() -> std::io::Result<()> {
    let info = fs::metadata("original.txt")?;

    println!("tamaño          : {} bytes", info.len());
    println!("¿es un archivo? : {}", info.is_file());
    println!("¿es una carpeta?: {}", info.is_dir());
    println!("¿solo lectura?  : {}", info.permissions().readonly());

    let hace = info.modified()?.elapsed().unwrap_or_default();
    println!("modificado hace : {} segundos", hace.as_secs());
    Ok(())
}
salidatamaño          : 19 bytes
¿es un archivo? : true
¿es una carpeta?: false
¿solo lectura?  : false
modificado hace : 18 segundos

La última línea cambia en cada ejecución, claro; las otras cuatro dependen solo del archivo. Y si la ruta no existe, metadata devuelve un error en lugar de valores vacíos, que es por lo que lleva el ?.

Las fechas no son DateTime. modified() devuelve un SystemTime, que es un instante sin calendario: sirve para restar y comparar, no para saber el día de la semana. Para convertirlo a una fecha legible hace falta chrono, que acepta un SystemTime directamente. Es la misma separación que hace Rust entre medir intervalos y manejar calendarios.

Lo que se puede consultar

Qué Cómo
Tamaño en bytes info.len()
Archivo, carpeta o enlace is_file(), is_dir(), is_symlink()
Última modificación info.modified()?
Último acceso y creación accessed()?, created()?
Solo lectura info.permissions().readonly()
Permisos de Unix en octal info.permissions().mode()
Sin seguir enlaces simbólicos fs::symlink_metadata(ruta)
No todo está disponible en todas partes. created() falla en algunos sistemas de archivos de Linux que sencillamente no guardan esa fecha, y devuelve un error en vez de inventársela. El modo en octal requiere además importar std::os::unix::fs::PermissionsExt y no compila en Windows. Si el programa tiene que funcionar en los dos sistemas, conviene ceñirse a tamaño, tipo y fecha de modificación, que sí están en todos.

El código de esta página se compiló y ejecutó con rustc 1.96.1 antes de publicarla; las salidas están copiadas de la ejecución real. Documentación oficial: el módulo std::fs.