【问题标题】:Close File stored in Map in Rust在 Rust 中关闭存储在 Map 中的文件
【发布时间】:2021-10-06 18:28:35
【问题描述】:

我将打开的文件存储在地图中:HashMap<u32, File>。有时会调用函数 read_to_filewrite_to_file。他们从地图中获取文件并进行相应的程序。为了避免从同一个文件写入和读取的冲突,我需要关闭该文件。我该怎么做?

【问题讨论】:

  • 通过删除std::fs::File 来关闭文件,您可能不希望或可以在您拥有的数据结构中执行此操作。为避免您描述的冲突,您可以将File 包装在std::cell::RefCell 中,并在您想写入File 时使用try_borrow_mut(),并在读取时使用try_borrow()。拥有对std::fs::File 的可变引用实际上并不需要写入它,但这样可以使读/写互斥。
  • @user2722968 我对不同的对象进行写入和读取(所以我打开了两个文件:一个用于读取,一个用于写入),它们都引用硬盘驱动器上的同一个文件
  • sync_data 可以在这里使用吗? doc.rust-lang.org/stable/std/fs/…
  • 这有意义吗:let f: File = self.streams.remove(&stream_id).unwrap(); drop(f); ?

标签: file rust io


【解决方案1】:

根据 Rust documentation std::fs::File 是:

对文件系统上打开文件的引用。

如果您将Files 存储在地图中,那么根据定义,它们是开放的。当变量被删除(超出范围)时,它们会自动关闭。

相反,您可以考虑在地图中存储Path,然后按需打开文件。如果您出于某种原因需要存储打开的文件,则可以将它们包装在 Arc<Mutex> 中(或者如果您的应用程序是单线程的,则使用 `Rc),以防止同时访问。

【讨论】:

  • 当我从地图中删除文件时,是否自动意味着该变量已被删除?
  • 可能是的。如果你不做任何其他事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2021-09-05
  • 2013-11-08
相关资源
最近更新 更多