代码之家  ›  专栏  ›  技术社区  ›  Tobias Hermann

如何写入大于2 GB的文件?

  •  3
  • Tobias Hermann  · 技术社区  · 6 年前

    以下代码:

    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 回复  |  直到 6 年前
        1
  •  6
  •   hellow Adolfo Casari    6 年前

    锈迹 write 依赖底层操作系统来写入字节。

    对于Linux系统, write syscall 将被使用。

    根据位置1,如果 count 大于 SSIZE_MAX ,结果是实现定义的;有关Linux上的上限,请参见注释。

    笔记:

    在Linux上, write() (和类似的系统调用)最多可以传输 0x7ffff000 (2147479552)字节,返回实际传输的字节数。(32位和64位系统都是这样。)

    所以神奇的数字是从这里来的。

    为了规避你的问题,使用 write_all 而不是 ,这将确保写入所有字节。

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