【问题标题】:How do I know I reached a file's maximum size when using ofstream?使用 ofstream 时,我如何知道我达到了文件的最大大小?
【发布时间】:2008-09-25 16:58:14
【问题描述】:

在使用 ofstream 写入文件时,我如何知道文件大小何时达到操作系统的最大文件大小 - 更具体地说是 linux 的最大文件大小 - ??

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    首先,最大文件大小是文件系统限制,而不是操作系统限制。根据文件系统的格式化方式,它甚至会因特定文件系统而异。

    至于您如何判断是否已达到限制,您的代码可能会在发生这种情况时引发异常,然后您将能够将其与操作系统错误代码相关联。

    请注意,“典型”EXT2 文件系统的实际限制为pretty darn big - 以TB 为单位。在实践中,你可能永远也达不到它。如果您认真地积累 TB 级数据,您可能需要考虑是否有更合理的方式来存储它,而不是单个巨大的文件。

    【讨论】:

    • 我认为这是由一些内核参数定义的文件系统限制。从您的链接:“ext2 文件系统的某些限制的原因是......和操作系统的内核”我正在运行 linux,我不能将超过 2GB 的文件写入文件。而且我还有很多空间。
    • 它也由您使用的编译器和库定义。要写入超过 2GB,您需要 64 位文件指针,这可能需要特殊的编译器标志,即使底层系统支持。
    【解决方案2】:

    你可以检查the bad bit is set。此外,使用exceptions,您可以强制流在设置坏位时抛出异常。

    【讨论】:

    • 出于好奇,这实际上是在这样的情况下设置的吗?这个实现是依赖的还是标准明确规定 fstream 实现需要捕获这个?
    • 如果您尝试写入流并且写入操作由于任何原因(包括尝试写入大于文件系统限制的文件)失败,则将设置坏位(或失败位)。
    • 我想知道您如何有效地从此类错误中恢复。您无法写入的数据仍在流缓冲区中。您需要一些方法来打开一个新文件并将未写入的数据复制到其中...
    【解决方案3】:

    我认为(不是 100% 肯定)你只需要在写入操作系统的最大文件大小后比较流的当前大小。否则我猜底层实现只会让你继续写,直到实际的操作系统 io 调用失败。

    【讨论】:

      【解决方案4】:

      好吧,fstream 对于“写入超过实现定义的最大文件大小的文件”(来自“man 2 write”)没有排他性例外,例如使用 C 函数时可用的错误代码 EFBIG '写'。因此,我认为必须像 Jim Crafton 所说的那样,将文件大小与一些用户定义的最大大小或与“streamoff”变量持有的最大值进行比较,该变量是用于处理文件大小的变量类型 - 文件实际偏移 - 在 iostream 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-06
        • 2021-09-05
        • 2010-12-14
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 2014-03-22
        相关资源
        最近更新 更多