【问题标题】:How to write files larger than 2 GB?如何写入大于 2 GB 的文件?
【发布时间】:2025-12-24 14:30:12
【问题描述】:

以下代码:

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字节的限制。

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

【问题讨论】:

  • 另外,创建2.5 GO的向量是不合理的。使用较小的缓冲区。 2^8 到 2^16,更好。

标签: file file-io rust filesystems


【解决方案1】:

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

对于 Linux 系统,将使用 write syscall

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

注意事项:

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

那么神奇的数字就是从那里来的。

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

注意:如果您在 Windows 下运行该程序,它将运行良好。

【讨论】:

  • 谢谢。那就更好了。毕竟不需要BufWriter。 :)
  • @TobiasHermann:出于性能原因,BufWriter 仍然可能更可取。尝试对两者进行基准测试。
  • 我不认为,posix 特别重要,只需 rust write 的文档就足够了。 “将缓冲区写入此对象,返回写入的字节数。”,doc.rust-lang.org/nightly/std/io/…
  • @Stargateur 你是对的,但是手册页解释了为什么只写入了 2147479552 个字节。