在MSVC6中处理大于2GB的文件!

3

在Windows MSVC6中,类似fseek、ftell等的普通文件相关函数只能处理最大2GB的文件(据我目前的了解,如有错误请指正)。

我想处理大于2GB的文件。应该怎么做?有哪些可用的函数?


1
我能否在C中使用标准库寻求超过2GB的位置? - phuclv
5个回答

3
我不确定,但限制为4 GB,操作系统 API 和使用这些 API 的标准库以及所使用的文件系统。 ftellfseek 函数使用32位整数,因此您将无法处理大于4GB的文件。您必须直接使用操作系统 API。
因此,您必须小心使用哪个函数,例如获取文件大小需要使用 ex 函数GetFileSizeEx,因此您必须确保使用使用64位文件偏移量的函数。同样适用于SetFilePointerEx
最后,您必须注意某些文件系统限制最大文件大小,FAT32 的设计不支持大于4 GB 的文件,NTFS 可以处理任何大小,但通常 API 仅适用于4 GB 或更小的大文件。

2

这个限制可能源于文件系统。FAT32的限制是4GB,而NTFS有更高的限制(以TB为单位)。

因此,您可以处理的文件大小取决于硬盘已经格式化为哪种文件系统以及您正在使用哪个操作系统,尽管您几乎肯定在使用能够处理NTFS上限的操作系统(Windows 2000或更高版本)。


2

大部分情况下,您需要忽略标准库中内置的所有文件函数,而只使用Win32 API中的函数——例如,您需要使用WriteFile而不是fwriteostream::write,需要使用SetFilePointer而不是fseekseekp来在文件中寻找。大多数Win32 API都可以处理大于4 GB的文件,而那些不能处理的API也有可以处理较大文件的替代品。


2

您可以使用Windows API来处理文件,例如CreateFile、ReadFile和WriteFile。这也为您提供了重叠和非重叠操作的选项。


1

实际上是16TB(对于将来发现此问题的任何人)。我刚刚使用重叠I/O创建了一个6GB的文件,以下代码片段展示了如何处理偏移量: OVERLAPPED ol; __int64 fileOffset; ol.hEvent = CreateEvent(0, TRUE, FALSE, 0); fileOffset = __int64(TEST_BUFFER_SIZE) * i; ol.Offset = (DWORD)fileOffset; ol.OffsetHigh = (DWORD)(fileOffset >> 32); printf("[%d %I64d] ", i, fileOffset); result = WriteFile(hFile, buffer, TEST_BUFFER_SIZE, &written, &ol);

要获取大小,可以执行以下操作...

DWORD dwHigh, dwLow =GetFileSize(hFile, &dwHigh);
__int64 FileSizeInBytes = __int64(dwHigh * (MAXDWORD + 1.0L)) + dwLow;

提示:如果您从API中开始收到“无效参数”返回代码/错误,则可能会搞乱数学并传递负偏移量。
(为了保护基本字节权利,从此示例中删除了一些无辜的变量和异常处理程序监管行动)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接