使用 ofstream 时,我如何知道我达到了文件的最大大小?
Posted
技术标签:
【中文标题】使用 ofstream 时,我如何知道我达到了文件的最大大小?【英文标题】:How do I know I reached a file's maximum size when using ofstream? 【发布时间】:2008-09-25 16:58:14 【问题描述】:在使用 ofstream 写入文件时,我如何知道文件大小何时达到操作系统的最大文件大小 - 更具体地说是 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 中。
【讨论】:
以上是关于使用 ofstream 时,我如何知道我达到了文件的最大大小?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ofstream 将数据写入其文件后更新 ifstream 对象
C++ read()-ing 从一个套接字到一个 ofstream