如何原子性替换文件?如何单操作完成文件打开与截断?
解决Rust文件操作的竞态条件问题
你现在写的这段代码,先检查文件存在就删除,再创建新文件,这两步中间有竞态条件——比如刚检查完文件存在,还没执行删除的时候,其他进程可能修改、删除这个文件,导致后续操作出问题。
想要用单个原子操作搞定打开+截断(或创建),不用分开判断删除,直接靠OpenOptions的参数组合就行,操作系统会保证这个操作是原子性的:
如果你的需求是不管文件原来存不存在,最后得到一个空的可写文件(相当于替换旧文件),就这么写:
let mut file = OpenOptions::new() .write(true) // 开启写入权限 .truncate(true) // 若文件已存在,直接截断为空 .create(true) // 若文件不存在,创建新文件 .open(&filename)?; debug!("output file opened (existing file truncated if present): {filename}");
要是你必须确保创建的是全新文件(文件已存在就直接报错),那直接用create_new(true)就行,不用提前删文件——它本身就是原子操作,只有文件不存在时才会创建,存在就报错,从根源避免竞态:
let mut file = OpenOptions::new() .write(true) .create_new(true) .open(&filename)?; debug!("new output file created: {filename}");
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

