gpt4 book ai didi

rust - 原子读取文件内容

转载 作者:行者123 更新时间:2023-12-03 11:36:09 26 4
gpt4 key购买 nike

在Linux上,如果有一个长时间运行的进程每秒将时间戳写入文本文件,那么我该如何从原子文件中自动读取时间戳?
这是我当前的实现:

fn read_timestamp() -> Result<String, &'static str> {
let path = "/timestamp.txt";
let metadata_result = fs::metadata(path);
match metadata_result {
Ok(_) => {
let lock_result = FileLock::lock(path, true, true);
match lock_result {
Ok(mut lock) => {
let mut content = String::new();
let read_result = lock.file.read_to_string(&mut content);
if read_result.is_ok() {
Ok(content)
} else {
Err("Cannot read file")
}
},
Err(_) => Err("Cannot acquire lock")
}
},
Err(_) => Err("File not found")
}
}
看起来很笨拙,我希望您能提供一些反馈。

最佳答案

我可以看到的一个大问题是锁定是racy,实际上并不会引起问题,但会导致不必要和无用的syscall流量:从技术上讲,可以在调用metadataFileLock::lock之间删除该文件。
因此,我可能只是直接执行FileLock::lock调用,然后检查其错误的内容以进行错误报告,如果失败,它将返回 io::Error ,因此应该告诉您该错误是由于文件不存在而引起的。
我觉得有些奇怪的是您对match的依赖,尤其是考虑到您很少使用这些错误。
我倾向于将高级组合器或if let用于一元或二进制代码路径(尤其是在忽略后备负载的情况下)。创建局部变量只是立即将其立即移动到match也不是真正习惯,您通常不会理会该局部变量。 YMMV虽然如此,但就其本身而言,肯定不是错误的,它只是比我认为必要或有保证的噪音大。
这也可能会受益于定制的Error类型,避免了显式错误和匹配。无论如何,这是没有自定义错误类型的可能版本:

fn read_timestamp2() -> Result<String, &'static str> {
let path = "/timestamp.txt";
match FileLock::lock(path, true, true) {
Ok(mut lock) => {
let mut content = String::new();
lock.file.read_to_string(&mut content)
.map(|_| content)
.map_err(|_| "Cannot read file")
},
Err(e) if e.kind() == NotFound => Err("File not found"),
Err(_) => Err("Cannot acquire lock")
}
}
您甚至可以进一步探究组合器:
fn read_timestamp() -> Result<String, &'static str> {
let path = "/timestamp.txt";
FileLock::lock(path, true, true)
.and_then(|mut lock| {
let mut content = String::new();
lock.file.read_to_string(&mut content)
.map(|_| content)
})
.map_err(|e| match e.kind() {
NotFound => Err("File not found"),
Interrupted | PermissionDenied | WouldBlock
=> Err("Cannot acquire lock"),
_ => Err("Cannot read file")
})
}
}
但是请注意,此代码在错误报告中并不是真正正确的: ErrorKind 不够精确,因此实际上,您需要调用 raw_os_error 并交叉引用手册页以查看可能来自何处。
老实说,第二个版本有些古怪。

关于rust - 原子读取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66594279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com