Я знаю, что могу вызвать drop
, чтобы явно закрыть fd. Но что, если файл используется внутри цикла?
Могу ли я справиться с этим, не используя небезопасные блоки кода?
Предположим, этот сценарий: Я хочу писать в файл каждые 10 секунд, и этот файл будет меняться каждые 10 минут. Имя файла генерируется по временной метке.
let mut file = File::create("ts1").unwrap();
loop {
file.write(buf).unwrap();
if time_elapsed() > 10 * 60 {
// how to close the old fd?
// drop cannot be used because it is inside the loop
file = File::create("ts2").unwrap();
}
thread::sleep(Duration::from_secs(10));
}
Я полагаю, что вы ищете способ синхронизировать операцию, выполняемую над файловым объектом, с диском. В этом случае вам нужно не бросать объект, а вызвать sync_all
.
let mut file = File::create("ts1").unwrap();
loop {
file.write(buf).unwrap();
if time_elapsed() > 10 * 60 {
// how to close the old fd?
// drop cannot be used because it is inside the loop
let _ = file.sync_all();
file = File::create("ts2").unwrap();
}
thread::sleep(Duration::from_secs(10));
}
Я знаю, что могу явно вызвать drop для закрытия fd. Но что, если файл используется внутри цикла?
Это не имеет значения? Пока компилятор видит, что вы повторно установили локальную переменную в допустимое значение между ее удалением и следующим использованием, он доволен. Здесь это даже бесполезно, переназначение обязательно заранее сбросит старое значение.