#file #rust #io
Вопрос:
Я храню открытые файлы на карте: HashMap<u32, File>
. Иногда функции read_to_file
и write_to_file
вызываются. Они получают файл с карты и выполняют соответствующую процедуру. Чтобы избежать конфликтов при записи и чтении из одного и того же файла, мне нужно закрыть файл. Как я могу это сделать?
Комментарии:
1. Закрытие файла выполняется путем удаления
std::fs::File
, чего вы, вероятно, не хотите или не можете сделать в имеющейся у вас структуре данных. Чтобы избежать конфликтов, как вы описываете , вы можете завернуть файлFile
в astd::cell::RefCell
и использоватьtry_borrow_mut()
его всякий раз, когда захотите писатьFile
иtry_borrow()
когда будете читать из него. Наличие изменяемой ссылки наstd::fs::File
самом деле не требуется для записи в нее, но таким образом вы делаете чтение/запись взаимоисключающими.2. @user2722968 Я пишу и читаю в разные объекты (поэтому у меня открыто два файла: один для чтения и один для записи), которые ссылаются на один и тот же файл на жестком диске
3. Может
sync_data
быть полезен здесь? doc.rust-lang.org/stable/std/fs/…4. Имеет ли это смысл:
let f: File = self.streams.remove(amp;stream_id).unwrap(); drop(f);
?
Ответ №1:
Согласно документации std::fs::File
Rust, это:
Ссылка на открытый файл в файловой системе.
Если вы храните File
s на карте, то они, по определению, открыты. Они автоматически закрываются, когда переменная удаляется (выходит за пределы области действия).
Вместо этого вы можете рассмотреть возможность сохранения a Path
на карте и открыть файл по требованию. Если вам по какой-либо причине необходимо хранить открытые файлы, вы можете обернуть их в Arc<Mutex>
(или в Rc, если ваше приложение однопоточное), чтобы предотвратить одновременный доступ.
Комментарии:
1. Когда я удаляю файл с карты, означает ли это автоматически, что переменная удаляется?
2. Наверное, да. Если ты больше ничего с ним не сделаешь.