如何使用与C open函数匹配的i32打开带有标志的文件?

时间:2019-10-08 23:16:19

标签: rust libc

我需要打开一个文件,并且标志有&Pathi32。我可以使用File::open(path)打开文件,但这不能让我设置选项。该文档说我应该使用OpenOptions,但是我看不到有什么方法可以从我的OpenOptions中获得i32。我的标志的内容在open(2)中定义。

如果您要自己测试,我正在使用的标记是526338

1 个答案:

答案 0 :(得分:3)

假设您使用的是类似Unix的系统,则可以使用OpenOptionsExt来设置标志:

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

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

请注意,您必须单独设置访问模式标志(例如,通过调用readwrite),因此,如果需要它们,则必须自己处理。例如:

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)?;