我有一个很大的结构数组7G,为方便此后内存映射读入,想一次写盘,
但用WriteFile写超过4G的文件时,不成功。BOOL WriteFile(HANDLE hFile, // 文件句柄
   LPCVOID lpBuffer, // 数据缓存区指针
   DWORD nNumberOfBytesToWrite, // 要写的字节数 ****
   LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针
   LPOVERLAPPED lpOverlapped // 
     OVERLAPPED结构体指针   );DWORD nNumberOfBytesToWrite, 这个参数我用long long定义,足够大,但执行后就是一个DWORD内的余数部分写盘了。请教如何解决。

解决方案 »

  1.   

    WriteFile参数类型是DWORD  最大值是2的32次方-1,显然文件大小定死了,不能超过最大值。
    xp、win7的ntfs系统,只要是32位的,都有4G文件限制,除非你升到64位系统,但那样可能现有的很多东西都要调整了
      

  2.   

    VC++ 大文件读写(大于4G)
    如果文件不见了。chkdsk就会显示。
      

  3.   

    DWORD nNumberOfBytesToWrite, 这个参数我用long long定义,足够大,?? 
    可怜的孩子!!
      

  4.   


    我原来格式硬盘考虑不周,ntfs用的每扇区4094,似乎每个文件就不超过4G,我先重新找个分区,格式时用32K,再试试多次写盘。刚好在网上看到了一个似乎是这样的写盘的代码:DWORD dwNumberOfBytesWritten = 0;
    int uDataSize = data.length();
    while(uPos < uDataSize)
    {
       if(!WriteFile(hFile, pData + uPos, uDataSize - uPos, &dwNumberOfBytesWritten, NULL))
       {
    return ERROR;
       }
      uPos += dwNumberOfBytesWritten;
    }
      

  5.   

    用8楼的方式,多次写入,成功。
    过其中的参数要用long long,有些地方还要改动。4楼的文章浏览了,是分块映射读入大文件的。我这内存足够大,一次可以整个映射G。内存价格低,多装内存省事。