问题
Given this code:
let any_offset: u64 = 42;
let mut file = File::open("/home/user/file").unwrap();
file.seek(SeekFrom::Start(any_offset));
// println!("{:?}", file.cursor_position())
How can I obtain the current cursor position?
回答1:
You should call Seek:seek with a relative offset of 0. This has no side effect and returns the information you are looking for.
Seek is implemented for a number of types, including:
impl Seek for Fileimpl<'_> Seek for &'_ Fileimpl<'_, S: Seek + ?Sized> Seek for &'_ mut Simpl<R: Seek> Seek for BufReader<R>impl<S: Seek + ?Sized> Seek for Box<S>impl<T> Seek for Cursor<T> whereimpl<W: Write + Seek> Seek for BufWriter<W>
Using the Cursor class mentioned by Aaronepower might be more efficient though, since you could avoid having to make an extra system call.
回答2:
According to the Seek trait API the new position is returned with the seek function. However you can also take the data of the File, and place it within a Vec, and then wrap the Vec in a Cursor which does contain a method which gets the current position.
Without 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);
With Cursor
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());
来源:https://stackoverflow.com/questions/34878970/how-to-get-the-current-cursor-position-in-file