Akiner Alkan
Akiner Alkan

Reputation: 6882

How to get the size of an already-opened File in Rust?

How can I get the size/length of the file that is declared as a File variable?

There is an option for getting it using the file name via fs::metadata:

let x = fs::metadata(file_path)?.len();

But I have a file that I already created and edited:

let mut my_file = File::create(file_path).unwrap();
my_file.write_all(buffer) // buffer is a data which comes from network and put into Vec<u8>

// From here, does it possible to get my_file length?
// Looking something like my_file.len();

Are there any function that gives the length of the File?

Upvotes: 35

Views: 26263

Answers (2)

hellow
hellow

Reputation: 13430

There are a few options.

  1. If you create the file like you did (File::create), you will truncate the file, which means it will set the size of that file to 0 and write the content of buffer to the file. This means that your file will now have the length buffer.len().

  2. Use File::metadata to get the metadata and therefore get the length of the file. Keep in mind that you have to sync the file (by using File::sync_all) with the underlying filesystem to update the metadata and get the correct value.

  3. Use Seek::seek which File implements. You can then get the current offset by using my_file.seek(SeekFrom::End(0)) which will tell you the last position available.

  4. On nightly (expected for release 1.35.0), you can use Seek::stream_len, which, unlike seek(SeekFrom::End(0)), restores the previous seek position.

Upvotes: 20

0xAX
0xAX

Reputation: 21817

The std::fs::File provides a metadata method. It can be used with your my_file like this:

my_file.metadata().unwrap().len();

Upvotes: 49

Related Questions