rust 如何获取文件中当前光标的位置?

nwsw7zdq  于 2022-12-29  发布在  其他
关注(0)|答案(3)|浏览(146)

给定以下代码:

let any_offset: u64 = 42;
let mut file = File::open("/home/user/file").unwrap();
file.seek(SeekFrom::Start(any_offset));
// println!("{:?}", file.cursor_position())

如何获得当前光标位置?

sbtkgmzw

sbtkgmzw1#

您应该使用相对偏移量0调用Seek:seek。这没有副作用,并返回您要查找的信息。
Seek可用于多种类型,包括:

  • impl Seek for File
  • impl<'_> Seek for &'_ File
  • impl<'_, S: Seek + ?Sized> Seek for &'_ mut S
  • impl<R: Seek> Seek for BufReader<R>
  • impl<S: Seek + ?Sized> Seek for Box<S>
  • impl<T> Seek for Cursor<T> where
  • impl<W: Write + Seek> Seek for BufWriter<W>

不过,使用Cursormentioned by Aaronepower可能更有效,因为这样可以避免进行额外的系统调用。

bf1o4zei

bf1o4zei2#

根据Seek trait API,新位置是通过seek函数返回的,但是您也可以获取File的数据,并将其放置在Vec中,然后将Vec Package 在Cursor中,Cursor包含获取当前位置的方法。

无光标

let any_offset: u64 = 42;
let mut file = File::open("/home/user/file").unwrap();
let new_position = file.seek(SeekFrom::Start(any_offset)).unwrap();
println!("{:?}", new_position);

带光标

use std::io::Cursor;

let any_offset: u64 = 42;
let mut file = File::open("/home/user/file").unwrap();
let contents = Vec::new();
file.read_to_end(&mut contents);
let mut cursor = Cursor::new(contents);
cursor.seek(SeekFrom::Start(any_offset));
println!("{:?}", cursor.position());
nnvyjq4y

nnvyjq4y3#

从Rust 1.51.0(2021)开始,Seek特性上有了stream_position()方法。

use std::io::Seek;

let pos = file.stream_position().unwrap();

然而,看看链接文档中的源代码,这纯粹是一个方便的 Package 器,它在后台使用相同的SeekFrom::Current(0)实现。

相关问题