我正在使用此代码来获取 rust 中的最新目录名称(这是展示我如何在项目中使用此代码 snippnet 的最小演示):
use std::fs;
fn main() {
let subdirectories = fs::read_dir("/opt")
.unwrap()
.filter_map(Result::ok)
.filter(|entry| entry.file_type().unwrap().is_dir())
.map(|entry| entry.path())
.collect::<Vec<_>>();
let latest_directory = subdirectories
.iter()
.max_by_key(|&dir| dir.metadata().unwrap().created().unwrap());
match latest_directory {
Some(directory) => {
let name = directory.file_name().unwrap_or_default().to_str().unwrap();
print!("{}", name);
}
None => {
}
}
}
这在我的本地 macOS 上运行良好,当我部署此代码以在 docker 中与 alpine 一起运行时,显示错误:
thread 'actix-rt|system:0|arbiter:0' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: Unsupported, message: "creation time is not available on this platform currently" }', src/service/project/project_service.rs:201:62
我错过了什么吗?这段代码可以在docker环境下运行吗?
POSIX 不要求 Unix 系统支持包括文件创建时间戳,仅支持上次访问 (atime)、上次修改 (mtime) 和上次状态更改 (ctime) 的时间戳。一些 Unix 系统确实使用通常称为“btime”(出生时间)的字段包含此信息。
但是,Linux 并未在 中公开此值
struct stat
,并且并非所有文件系统都支持它。值得注意的是,ext4、xfs 和 btrfs 都是如此,它们是一些最常见的文件系统,但 Linux 支持多种当前不公开此信息的文件系统(并且可能根本不支持它),包括各种FAT、NTFS 和 UDF 的各种类型。可以使用
statx
系统调用,但显然 Rust 目前还不支持它,而且它是在 2016 年才添加的,这意味着仍然有操作系统可能不支持它(例如 RHEL 7) 2014 年推出)。glibc 和 musl 都支持它,但是 Alpine 使用的 musl 是在 2020 年才添加的,这可能太新了,无法被 Rust 标准库依赖。通常,获取最新文件或目录的最便携方法是修改时间。这几乎是普遍可用的,包括在 POSIX 中。访问时间可能不太有用,并且经常出于性能原因而被禁用。