能力值:
( LV2,RANK:10 )
|
-
-
2 楼
这种问题是不是先问一问MSDN好一些?
|
能力值:
( LV9,RANK:610 )
|
-
-
3 楼
感谢您的回答
我用过
SetFilePointer SetEndOfFile组合不行
CreateFileMapping 也不行
在网络上查了一些资料都没有合适的方法
以前我认为就像MSND上解释的 SetFilePointer中的高32位 低32位的俩参数控制
发现完全不行~
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
关注关注
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
WINAPI可以读、写、创建、定位超过2G的文件没问题,检查你的文件所在卷是否为NTFS卷,FAT32不支持超过2G的文件。
|
能力值:
( 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);
}
}
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
额,不会吧,楼主用的还是FAT32? 这是很低级的错误。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
FAT32是不支持4GB以上的文件才对。。。
|
能力值:
( 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("成功完成对文件的访问");
}
转自大文件读取,分段读取。
|