Как явно закрыть дескриптор файла в цикле в ржавчине?

Я знаю, что могу вызвать 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));
}

141
2

Ответы:

Я полагаю, что вы ищете способ синхронизировать операцию, выполняемую над файловым объектом, с диском. В этом случае вам нужно не бросать объект, а вызвать 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. Но что, если файл используется внутри цикла?

Это не имеет значения? Пока компилятор видит, что вы повторно установили локальную переменную в допустимое значение между ее удалением и следующим использованием, он доволен. Здесь это даже бесполезно, переназначение обязательно заранее сбросит старое значение.