Закрыть файл, хранящийся на карте в Rust

#file #rust #io

Вопрос:

Я храню открытые файлы на карте: HashMap<u32, File> . Иногда функции read_to_file и write_to_file вызываются. Они получают файл с карты и выполняют соответствующую процедуру. Чтобы избежать конфликтов при записи и чтении из одного и того же файла, мне нужно закрыть файл. Как я могу это сделать?

Комментарии:

1. Закрытие файла выполняется путем удаления std::fs::File , чего вы, вероятно, не хотите или не можете сделать в имеющейся у вас структуре данных. Чтобы избежать конфликтов, как вы описываете , вы можете завернуть файл File в a std::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. Наверное, да. Если ты больше ничего с ним не сделаешь.