gpt4 book ai didi

windows - rust :来自 “file repository”结构的怪异行为

转载 作者:行者123 更新时间:2023-12-03 11:48:20 25 4
gpt4 key购买 nike

我正在运行一些测试,以了解实现某种存储库结构的最佳方法是什么,该存储库结构包含要开发的应用程序的程序所使用的每个文件。 (如果有任何意义)。
这就是我所做的:

use std::path::Path;
use std::fs::{File, OpenOptions};
use std::io::{Write, Read};

#[derive(Debug)]
struct Repo<'a> {
path: Box<&'a Path>,
}

impl Repo<'_> {
pub fn new() -> Self {
Self { path: Box::new(Path::new("test.txt")) }
}

pub fn get_mut(&self) -> File {
OpenOptions::new().write(true).read(false).open(&*self.path).unwrap()
}

pub fn get_imm(&self) -> File {
OpenOptions::new().write(false).read(true).open(&*self.path).unwrap()
}
}

fn main() {
let f = Repo::new();

let mut f_mut = f.get_mut();
let mut f_imm = f.get_imm();

let mut buf1 = String::new();
f_imm.read_to_string(&mut buf1).unwrap();
println!("1: {}", buf1);

f_mut.write("123456".to_string().as_bytes()).unwrap();

let mut buf2 = String::new();
f_imm.read_to_string(&mut buf2).unwrap();
println!("2: {}", buf2);
}
假设有一个空的“test.txt”文件,则两个println!()的预期输出为:
1:
2: 123456
实际上是这样。但是,如果我尝试将写入值(“123456”)更改为其他值,然后重新编译并运行程序,则会发生一些奇怪的事情;有时第二个输出的期望值缺少一些字符或完全为空。仅当“test.txt”为空或只是看似随机的机会时,此代码才能正常运行。
有人可以向我解释为什么会发生这种情况,以及为什么此代码可能不是很好的做法吗?
也许这是我的机器甚至rustc本身的问题。
在Windows 10上运行它。(英语不是我的母语)

最佳答案

您似乎同时使用不同的访问模式打开了两次文件。可能发生的情况是操作系统尚未完成将传递给f_mut的数据写入文件。
这是因为文件I/O操作合并了缓冲以提高性能,并且偶尔会刷新缓冲区,但是并没有统一定义其频率。幸运的是,可以在读取内容之前添加flush the data manually
该代码不是最佳实践,因为您将打开对同一文件的2个引用,并且当句柄分开时,上述缓冲不能很好地工作。保持结构不变,我将打开一个具有读写访问权限的文件,并抽象化读写操作。对于单个读取/写入,您将需要执行file seeking-在写入之前先搜索到文件的末尾,然后在读取之前搜索到文件的开始。

关于windows - rust :来自 “file repository”结构的怪异行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62701520/

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