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

时间:2010-01-19 05:29:48

标签: c windows file

Windows MSVC6中与fseek,ftell等正常文件相关的功能只能处理高达2GB的文件(根据我目前的理解,如果我错了请纠正我。)

我想使用文件> 2GB。我该怎么办呢?有哪些功能?

5 个答案:

答案 0 :(得分:2)

我不确定但是限制是4 GB,OS API以及使用这些API和使用的文件系统的标准库。

ftellfseek函数使用32位整数,因此您将无法处理大于4GB的文件。您必须直接使用OS API。

所以你必须要小心你使用的是什么函数,例如为了获得你必须使用ex函数GetFileSizeEx的文件大小,所以你必须确保使用使用64位文件偏移的函数。 SetFilePointerEx

也是如此

最后一句话你知道有些文件系统限制了最大文件大小,FAT32不会处理大于4 GB的文件,NTFS可以处理任何大小,但API通常是4 GB或更小的大文件。

答案 1 :(得分:1)

限制可能源于文件系统。 FAT32的限制为4GB,而NTFS的限制则更高(以兆兆字节为单位)。

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

答案 2 :(得分:1)

在大多数情况下,您必须忽略标准库中内置的所有文件函数,并且只使用Win32 API中的函数 - 例如而不是fwriteostream::write,您需要使用WriteFile。同样,要在文件中搜索,您需要使用SetFilePointer代替fseekseekp。大多数Win32 API可以处理大于4 GB的文件 - 少数无法替代可以处理更大文件的文件。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

实际上是16TB(对于将来发现这一点的人)。我刚刚使用重叠I / O创建了一个6GB文件的6710886400 - 以下代码段显示了如何使用偏移量     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获得“无效参数”返回代码/错误,你可能会弄乱数学并传递负偏移量。

(从此示例中删除了一些无辜变量和异常处理程序监管操作以保护基本字节权限)