首页
社区
课程
招聘
如何创建大文件(大于2GB)?
发表于: 2010-3-24 22:43 6725

如何创建大文件(大于2GB)?

2010-3-24 22:43
6725
要求能顺利的读写定位~
小弟在做一个FTP的Client~
大文件  Oh,My God~!
Help~~

ps.项目是个C++的工程,最好给出相关大文件操作源码,或者给出可用Windows api也凑合。。。哈哈

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 45
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这种问题是不是先问一问MSDN好一些?
2010-3-24 23:34
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
感谢您的回答
我用过
SetFilePointer SetEndOfFile组合不行
CreateFileMapping 也不行
在网络上查了一些资料都没有合适的方法
以前我认为就像MSND上解释的  SetFilePointer中的高32位 低32位的俩参数控制
发现完全不行~
2010-3-25 00:29
0
雪    币: 75
活跃值: (688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
关注关注
2010-3-25 01:22
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
WINAPI可以读、写、创建、定位超过2G的文件没问题,检查你的文件所在卷是否为NTFS卷,FAT32不支持超过2G的文件。
2010-3-25 08:17
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
还是给个代码吧
void fileoptest()
{
        //示例代码,无错误检查
        HANDLE hFile=CreateFileA("H:\\filetst",GENERIC_ALL,0,0,CREATE_NEW,0x20,0);
        LONG lHigh=1;
        //创建文件4G+10字节的文件,
        if(hFile!=INVALID_HANDLE_VALUE)
        {
                SetFilePointer(hFile,10,&lHigh,FILE_BEGIN);
                SetEndOfFile(hFile);
                CloseHandle(hFile);
                //到此应可以看到文件已被创建
        }
        hFile=CreateFileA("H:\\filetst",GENERIC_ALL,0,0,OPEN_EXISTING,0x20,0);
        if(hFile!=INVALID_HANDLE_VALUE)
        {
                //指针移动4G处
                SetFilePointer(hFile,0,&lHigh,FILE_BEGIN);
                DWORD uLen=0;
                //写文件,第一次写时会很慢
                WriteFile(hFile,&lHigh,2,&uLen,0);
                CloseHandle(hFile);
        }
}
2010-3-25 08:32
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
额,不会吧,楼主用的还是FAT32? 这是很低级的错误。
2010-3-25 09:26
0
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
FAT32是不支持4GB以上的文件才对。。。
2010-3-25 10:43
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
// 选择文件
CFileDialog fileDlg(TRUE, "*.txt", "*.txt", NULL, "文本文件 (*.txt)|*.txt||", this);
fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
fileDlg.m_ofn.lpstrTitle = "通过内存映射文件读取数据";
if (fileDlg.DoModal() == IDOK)
{
 // 创建文件对象
 HANDLE hFile = CreateFile(fileDlg.GetPathName(), GENERIC_READ | GENERIC_WRITE,
   0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 if (hFile == INVALID_HANDLE_VALUE)
 {
  TRACE("创建文件对象失败,错误代码:%drn", GetLastError());
  return;
 }
 // 创建文件映射对象
 HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
 if (hFileMap == NULL)
 {
  TRACE("创建文件映射对象失败,错误代码:%drn", GetLastError());
  return;
 }
 // 得到系统分配粒度
 SYSTEM_INFO SysInfo;
 GetSystemInfo(&SysInfo);
 DWORD dwGran = SysInfo.dwAllocationGranularity;
 // 得到文件尺寸
 DWORD dwFileSizeHigh;
 __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
 qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
 // 关闭文件对象
 CloseHandle(hFile);
 // 偏移地址
 __int64 qwFileOffset = 0;
 // 块大小
 DWORD dwBlockBytes = 1000 * dwGran;
 if (qwFileSize < 1000 * dwGran)
  dwBlockBytes = (DWORD)qwFileSize;
  while (qwFileOffset > 0)
  {
   // 映射视图
   LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,
      (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),
      dwBlockBytes);
   if (lpbMapAddress == NULL)
   {
    TRACE("映射文件映射失败,错误代码:%drn", GetLastError());
    return;
   }
   // 对映射的视图进行访问
   for(DWORD i = 0; i < dwBlockBytes; i++)
    BYTE temp = *(lpbMapAddress + i);
    // 撤消文件映像
    UnmapViewOfFile(lpbMapAddress);
    // 修正参数
    qwFileOffset += dwBlockBytes;
    qwFileSize -= dwBlockBytes;
  }
  // 关闭文件映射对象句柄
  CloseHandle(hFileMap);
  AfxMessageBox("成功完成对文件的访问");
}
转自大文件读取,分段读取。
2010-3-25 16:32
0
游客
登录 | 注册 方可回帖
返回
//