处理大数据,读写大于4GB的文件,不要告诉我用内存映射的方法;
现在我要处理一组数据,总大小估计几十个G;开始用的是FILE *rFile,fseek,ftell,fwrite但是当数据量到4G的时候,就再也写不进去了。不想用内存映射的方法,因为之后的已经全写完了,能不能在现有的方法上改,大侠求教?
补充:对了,我用的是32位xp系统,vc6.0
追问:CreateFile最大能创建多大的文件?最后问一下,
while (bWorking)
{
CStatic* p = (CStatic*)GetDlgItem(IDC_STATIC_FILE);
'
'
'
p->SetWindowText(PathName);
delete p;
}
这里的指针p到底要怎么删除?这样子删是有错误的
答案:用CreateFile,WriteFile和ReadFile可以操作大于超过4G的文件
下面的代码我已测试OK(在D:盘建立一个10G的文件)
HANDLE file = CreateFile("d:\\big.bin", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (file != INVALID_HANDLE_VALUE)
{
DWORD cb;
BYTE *d = new BYTE[512*1024*1024];
for (int i=0; i<20; i++)
{
WriteFile(file, d, 512*1024*1024, &cb, NULL);
}
delete []d;
CloseHandle(file);
}
不过有一点需要注意,你存放文件的目标逻辑盘的文件系统必须是NTFS,
因为FAT32系统本身就不支持大于4G的文件
其他:安装64位的操作系统。使用fseeki64等的函数。
如果没条件,那就别让文件太大,利用多个文件来做。
利用逻辑,比如文件名
filename100k.dat
filename200k.dat
filename300k.dat
filename400k.dat
.......
filename(n)k.dat
每个文件100k,当文件读写指针超过100k就跳到下一个100k的文件。 C语言的文件长度获取函数最大值到4GB就溢出了。
用windows api吧,获取文件长度GetFileSize分为高地位分别从返回值和参数返回。
写入时可通过WriteFile的lpOverlapped参数设置偏移值,能支持更大的文件。
参数虽然多一点,可是总能解决你的问题。如果调用的地方很多,你可以把这几个函数封装一下,很多参数调用时都是一样的。希望对你有帮助。
DWORD WINAPI GetFileSize(
__in HANDLE hFile,
__out_opt LPDWORD lpFileSizeHigh
);
BOOL WINAPI WriteFile(
__in HANDLE hFile,
__in LPCVOID lpBuffer,
__in DWORD nNumberOfBytesToWrite,
__out_opt LPDWORD lpNumberOfBytesWritten,
__inout_opt LPOVERLAPPED lpOverlapped
);
HANDLE WINAPI CreateFile(
__in LPCTSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);
Requirements
Minimum supported clientWindows XP
Minimum supported serverWindows Server 2003
HeaderFileAPI.h (include Windows.h);WinBase.h on Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP (include Windows.h)
LibraryKernel32.lib
DLLKernel32.dll
Unicode and ANSI namesCreateFileW (Unicode) and CreateFileA (ANSI)
上一个:vc++求指导~!~!
下一个:MFC中鼠标的格式是什么样的?