如何写大于2 GB的文件?

时间:2018-12-17 09:42:06

标签: file file-io rust filesystems

以下代码:

use std::fs::File;
use std::io::Write;

fn main() {
    let encoded: Vec<u8> = vec![0; 2500000000];
    let mut buffer = File::create("file.bin").unwrap();
    let written_bytes = buffer.write(&encoded).unwrap();
    assert_eq!(written_bytes, encoded.len());
}

以下错误:

thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `2147479552`,
 right: `2500000000`', src/main.rs:8:5

因此,似乎限制为2^31 - 4096个字节。

我该如何解决?我想写一个更大的文件。 :)

1 个答案:

答案 0 :(得分:6)

锈迹>>>a='a-b';b='a-b' >>>a is b False 依赖底层操作系统写入字节。

对于Linux系统,将使用write syscall

  

根据POSIX.1,如果write大于count,则结果是实现定义的;有关Linux的上限,请参见NOTES。

注意:

  

在Linux上,SSIZE_MAX(和类似的系统调用)将最多传输write()(2,147,479,552)个字节,并返回实际传输的字节数。 (在32位和64位系统上都是如此。)

所以魔术数字从那里来。

为避免问题,请使用write_all而不是0x7ffff000,这将确保已写入所有字节。

请注意:如果您在Windows下运行该程序,它将运行正常。