< 返回版块

jackalchenxu 发表于 2020-06-04 00:14

Tags:global singleton File handle

需要设计一个全局变量,容纳std::fs:File类型的数据,因为需要可变(在初始化函数中由用户输入的路径文件名来做初始化),猜测应该使用类似lazy_static或者once_cell来变量声明。

在初始化函数中创建File对象。

但是问题来了,因为多个函数都需要(可变)引用这个对象(fs read数据);2个函数负责使用文件对象写数据。由于效率原因,不希望该对象对应的文件被频频打开和关闭,希望是初始化时就创建文件,之后文件句柄一直可用。

如何设计该对象的声明和初始化,和使用呢?

评论区

写评论
Ryan-Git 2020-06-05 20:42

一个文件句柄要并发读写,不保护怎么行?rust 只是通过编译器强制你必须这么做而已。

Neutron3529 2020-06-05 09:37

这是doc里面的说法,读可以不用&mut(对某些系统),但写一定要&mut 所以大概 如果要求同时读写还是直接上锁更好一些

use std::fs::File;
use std::io::BufReader;
use std::io::prelude::*;

fn main() -> std::io::Result<()> {
    let file = File::open("foo.txt")?;
    let mut buf_reader = BufReader::new(file);
    let mut contents = String::new();
    buf_reader.read_to_string(&mut contents)?;
    assert_eq!(contents, "Hello, world!");
    Ok(())
}

Note that, although read and write methods require a &mut File, because of the interfaces for Read and Write, the holder of a &File can still modify the file, either through methods that take &File or by retrieving the underlying OS object and modifying the file that way. Additionally, many operating systems allow concurrent modification of files by different processes. Avoid assuming that holding a &File means that the file will not change.

juzi5201314 2020-06-04 10:21

OnceCell::sync::Lazy<RwLock>一把梭?

作者 jackalchenxu 2020-06-04 10:02

是的,read也需要&mut self...多谢纠正! 现在遇到的问题就是文件对象要如何设计来保存和使用。

对以下内容的回复:

songzhi 2020-06-04 09:53

首先读文件不能叫只读引用吧,标准库里的read函数也是要&mut self的。其次,因为RAII,一般是drop了那个文件对象之后才会关闭文件,所以不存在频繁打开关闭问题吧。

1 共 5 条评论, 1 页