Trait std::os::unix::fs::FileExt

1.15.0 · source ·
pub trait FileExt {
    // Required methods
    fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<usize>;
    fn write_at(&self, buf: &[u8], offset: u64) -> Result<usize>;

    // Provided methods
    fn read_vectored_at(
        &self,
        bufs: &mut [IoSliceMut<'_>],
        offset: u64
    ) -> Result<usize> { ... }
    fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<()> { ... }
    fn write_vectored_at(
        &self,
        bufs: &[IoSlice<'_>],
        offset: u64
    ) -> Result<usize> { ... }
    fn write_all_at(&self, buf: &[u8], offset: u64) -> Result<()> { ... }
}
Available on Unix only.
Expand description

特定于 Unix 的 fs::File 扩展。

Required Methods§

source

fn read_at(&self, buf: &mut [u8], offset: u64) -> Result<usize>

从给定的偏移量开始读取多个字节。

返回读取的字节数。

偏移量相对于文件的开始,因此独立于当前游标。

当前文件游标不受此函数影响。

请注意,类似于 File::read,短读返回不会出错。

Examples
use std::io;
use std::fs::File;
use std::os::unix::prelude::FileExt;

fn main() -> io::Result<()> {
    let mut buf = [0u8; 8];
    let file = File::open("foo.txt")?;

    // 现在,我们从偏移量 10 读取 8 个字节。
    let num_bytes_read = file.read_at(&mut buf, 10)?;
    println!("read {num_bytes_read} bytes: {buf:?}");
    Ok(())
}
Run
source

fn write_at(&self, buf: &[u8], offset: u64) -> Result<usize>

从给定的偏移量开始写入多个字节。

返回写入的字节数。

偏移量相对于文件的开始,因此独立于当前游标。

当前文件游标不受此函数影响。

当写入超出文件末尾时,文件被适当扩展并且中间字节被初始化为值 0.

请注意,与 File::write 相似,返回短写也不是错误。

Examples
use std::fs::File;
use std::io;
use std::os::unix::prelude::FileExt;

fn main() -> io::Result<()> {
    let file = File::open("foo.txt")?;

    // 现在,我们在偏移量 10 处写入。
    file.write_at(b"sushi", 10)?;
    Ok(())
}
Run

Provided Methods§

source

fn read_vectored_at( &self, bufs: &mut [IoSliceMut<'_>], offset: u64 ) -> Result<usize>

🔬This is a nightly-only experimental API. (unix_file_vectored_at #89517)

read_at 类似,只是它读入一片缓冲区。

复制数据以按顺序填充每个缓冲区,而写入的最终缓冲区可能仅被部分填充。 此方法的行为必须等同于使用串联缓冲区读取的单个调用。

1.33.0 · source

fn read_exact_at(&self, buf: &mut [u8], offset: u64) -> Result<()>

从给定的偏移量读取填充 buf 所需的确切字节数。

偏移量相对于文件的开始,因此独立于当前游标。

当前文件游标不受此函数影响。

io::Read::read_exact 相似,但使用 read_at 代替 read

Errors

如果此函数遇到 io::ErrorKind::Interrupted 类型的错误,则该错误将被忽略,并且操作将继续。

如果此函数在完全填充缓冲区之前遇到 “end of file”,它将返回 io::ErrorKind::UnexpectedEof 类型的错误。 在这种情况下,buf 的内容未指定。

如果遇到任何其他读取错误,则此函数立即返回。在这种情况下,buf 的内容未指定。

如果此函数返回错误,则无法确定已读取多少字节,但读取的字节数永远不会超过完全填充缓冲区所需的字节数。

Examples
use std::io;
use std::fs::File;
use std::os::unix::prelude::FileExt;

fn main() -> io::Result<()> {
    let mut buf = [0u8; 8];
    let file = File::open("foo.txt")?;

    // 现在,我们从偏移量 10 中正好读取了 8 个字节。
    file.read_exact_at(&mut buf, 10)?;
    println!("read {} bytes: {:?}", buf.len(), buf);
    Ok(())
}
Run
source

fn write_vectored_at(&self, bufs: &[IoSlice<'_>], offset: u64) -> Result<usize>

🔬This is a nightly-only experimental API. (unix_file_vectored_at #89517)

write_at 类似,只是它从缓冲区的一片中写入。

数据是按顺序从每个缓冲区复制的,从中读取的最终缓冲区可能仅被部分消耗。 此方法必须表现为对 write_at 的调用,并连接缓冲区。

1.33.0 · source

fn write_all_at(&self, buf: &[u8], offset: u64) -> Result<()>

尝试从给定的偏移量开始写入整个缓冲区。

偏移量相对于文件的开始,因此独立于当前游标。

当前文件游标不受此函数影响。

此方法将不断地调用 write_at,直到没有更多数据要写入或返回非 io::ErrorKind::Interrupted 类型的错误为止。 在成功写入整个缓冲区或发生此类错误之前,此方法将不会返回。 将返回第一个不是由该方法生成的 io::ErrorKind::Interrupted 类型的错误。

Errors

该函数将返回 write_at 返回的第一个非 io::ErrorKind::Interrupted 类型的错误。

Examples
use std::fs::File;
use std::io;
use std::os::unix::prelude::FileExt;

fn main() -> io::Result<()> {
    let file = File::open("foo.txt")?;

    // 现在,我们在偏移量 10 处写入。
    file.write_all_at(b"sushi", 10)?;
    Ok(())
}
Run

Implementors§