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 bytesinfo.len()
Archivo, carpeta o enlaceis_file(), is_dir(), is_symlink()
Última modificacióninfo.modified()?
Último acceso y creaciónaccessed()?, created()?
Solo lecturainfo.permissions().readonly()
Permisos de Unix en octalinfo.permissions().mode()
Sin seguir enlaces simbólicosfs::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.