问题 写大文件


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


1304
2017-11-19 14:18


起源



答案:


这取决于:

  • 您正在使用的文件系统。像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


9
2017-11-19 14:59



“Thirtytwoth”?我忍不住自己:) - korona
“我们在这里谈论语法;感觉是另一个问题” - 我不记得我在哪里阅读。 - Aaron Digulla
谢谢:)在你的链接中找到offset_to_position成了伎俩 - user38941
比较两个streampos时要小心,因为VS2005中的32位运算符==在比较之前将截断为32位。更好的方法是使用position_to_offset并比较偏移量。 - dalle
谢谢;我澄清了这一点。 - Aaron Digulla


答案:


这取决于:

  • 您正在使用的文件系统。像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


9
2017-11-19 14:59



“Thirtytwoth”?我忍不住自己:) - korona
“我们在这里谈论语法;感觉是另一个问题” - 我不记得我在哪里阅读。 - Aaron Digulla
谢谢:)在你的链接中找到offset_to_position成了伎俩 - user38941
比较两个streampos时要小心,因为VS2005中的32位运算符==在比较之前将截断为32位。更好的方法是使用position_to_offset并比较偏移量。 - dalle
谢谢;我澄清了这一点。 - Aaron Digulla


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


5
2017-11-19 15:13





在NTFS中,唯一的实际限制是卷的大小。如果要测试它,可以使用命令行创建一个虚拟文件:
fsutil文件createnew [filename] [validdatalength]
例如:
fsutil文件createnew TestFile.bin 65536000000
假设您有NTFS卷,那应该创建一个64GB的文件。


1
2017-11-19 16:34



我从来不知道fsutil。谢谢! - Ferruccio