Как открыть файл с флагами, предоставленными как i32, совпадающими с функцией открытия C? - PullRequest
0 голосов
/ 09 октября 2019

Мне нужно открыть файл, и у меня есть &Path и i32 для флагов. Я могу открыть файлы с File::open(path), но это не позволит мне установить параметры. В документации сказано, что я должен использовать OpenOptions, но я не вижу способа получить OpenOptions из моего i32. Содержимое моих флагов определено как open(2).

Я использую флаги 526338, если вы хотите проверить это самостоятельно.

1 Ответ

3 голосов
/ 09 октября 2019

Предполагая, что вы находитесь в Unix-подобной системе, вы можете использовать OpenOptionsExt для установки своих флагов:

use std::fs::OpenOptions;
use std::os::unix::fs::OpenOptionsExt;

let file = OpenOptions::new()
    .read(true)
    .custom_flags(flags)
    .open(&path)?;

Обратите внимание, что вы должны установить флаги режима доступа отдельно(например, позвонив по номеру read или write), поэтому, если они вам нужны, вам придется обращаться с ними самостоятельно. Например:

use std::os::unix::fs::OpenOptionsExt;

use libc::{O_RDONLY, O_RDWR, O_WRONLY};

let file = OpenOptions::new()
    .custom_flags(flags)
    .read((flags & O_ACCMODE == O_RDONLY) || (flags & O_ACCMODE == O_RDWR))
    .write((flags & O_ACCMODE == O_WRONLY) || (flags & O_ACCMODE == O_RDWR))
    .open(&path)?;
...