【问题标题】:Write large file写入大文件
【发布时间】:2008-11-19 14:18:43
【问题描述】:

我尝试写入一个大文件,但它似乎不适用于大于 2GB 的文件。 我尝试过使用 boost::iostreams::file_sink。这只是提升流的限制吗?有没有其他方法可以在 Win64 和 win32 上写大文件?

【问题讨论】:

    标签: c++ file-io win64


    【解决方案1】:

    这取决于:

    • 您正在使用的文件系统。像 FAT 这样的旧文件系统只允许最大 2GB 的文件。使用 NTFS。
    • 您的库必须编译为允许大文件(64 位查找偏移)。如果他们使用 32 位整数在文件中查找(检查调用“seek”和“tell”的参数和结果),您只能访问 2GB(2^31 位,第 32 位是符​​号 +/-)

    这也可能有帮助:http://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/faq.html#offsets

    【讨论】:

    • 比较两个 streampos 时要小心,因为在 VS2005 中构建 32 位 operator== 将在比较之前截断为 32 位。更好的是使用 position_to_offset 并比较偏移量。
    • FAT32 允许文件最大为 4GB 减 1。但我同意使用 NTFS 的建议。
    【解决方案2】:

    在 Win32/64 中,ReadFile 和 WriteFile 可以写入大于 4gb 的文件。定位是通过SetFilePointerEx 中的 64 位 _LARGE_INTEGER 值完成的。同样,要获得您需要的文件大小GetFileSizeEx,而不是基本的 GetFileSize。

    【讨论】:

      【解决方案3】:

      在 NTFS 中,唯一真正的限制是卷的大小。如果您想对此进行测试,您可以使用命令行创建一个虚拟文件:
      fsutil 文件 createnew [文件名] [有效数据长度]
      例如:
      fsutil 文件创建新 TestFile.bin 65536000000
      假设您有一个 NTFS 卷,那应该会创建一个 64GB 的文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-02
        • 2020-07-12
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多