当前位置:编程学习 > VC++ >>

处理大数据,读写大于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中鼠标的格式是什么样的?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,