文件映射问题,文件大于4G
最近在做一个大于4G文件的读取,用到了文件映射,但是对这三个函数的理解始终不到位,有以下几个问题,先贴一段代码
HANDLE hFile = CreateFile(_T("trial.csv"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

DWORD size_high, file_size;
file_size = GetFileSize(hFile, &size_high);

首先,文件大于4G,那么高位文件大小就不是0,在我的文件大小为5G的情况下,为1,那么整个文件的大小应该怎么表示,是size_high <<32 + file_size么?
HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, size_high, file_size, NULL);
if (hMapFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("cannot create file mapping %d\n"), GetLastError());
CloseHandle(hFile);
return 0;

}

最重要的问题就是在这个函数中,文件大于了4G,所以直接0,0的话,会出现问题,就是读取数据不全,因而这个函数的参数中,高低位参数设置,不知道该怎么设置
void *pFile = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
unsigned char *fileforuse = (unsigned char *)pFile;

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
打开大于4G的文件
请问有什么办法能快速的打开大于4G的文件,分段读取文件内的内容??
mfc 申请大于4g文件
//对文件进行写操作 CFile mFile( &quot;user.dat&quot; ,CFile::modeWrite|CFile::modeCreate); //mFile.Write(sRead,2); ULONGLONG len=ULONGLONG(5) * 1024 * 1024 * 1024 ; //5gb mFile.SetLength(len); mFile.Flush(); ...
ASP.NET上传大于4G的文件
目标:上传大于4G的文件rnrn试了很多方法,都是在文件的大小上卡住了,请各位达达们帮忙,有好用的第三方控件最佳,或者给我些思路及文章。
在delphi中如何读写大于4G的文件?
在delphi中如何读写大于4G的文件?因为好多函数都是longint,只能小于2G!
如何用读写处理大于4G的文件?
比如如何生成一个大于4G的文件,如何读写大于4G的文件,请高手赐教,解决马上送分。
U盘怎样传输大于4G的文件?
前言: 最近在在研究这样在物理机上面装Linux系统,这样就遇到很多问题,其中一个很重要的就是:需要刻录一个Linux启动盘,可是Linux镜像有4G之多,可是普通的U盘只能传输小于4G的文件,怎么办呢? 于是就。。。百度呗,果然百度是万能的。 我们只需要做一步就可以解决这个问题,那就是给U盘转格式。 一般的U盘都是FAT32 这种格式的,我们需要把它转成NTFS格式。
如何实现抓娶大于4G的文件?
我用WriteFile()的方式抓取文件,当大于4G的都给我切断了,查询返回植是,STATUS_DISK_FULL =0xc00007f,可是我的磁盘空间一定是没有问题的剩余空间大于4G,这又是啥原因的呢?难道是有个啥开关才能突破4G的文件?谢谢 rn
大于4G的文件用什么读写?
文件映射不好定位,不用了,还有什么办法?
局域网QQ可以传送大于4G的文件
32位的操作系统,地址寻址空间是2的32次方,所以传送4g的文件会出错,传送不了,同样的有个“飞鸽传书”也传不了。这个“局域网QQ”可以传送大于4G的文件。希望有用 。
PS3 游戏文件分割 分割大于4G的文件
PS3用USB传游戏文件大于4G需要分割 分割成特定扩展名的文件,玩PS3的知道吧 有个叫OpenSplit的,用JAVA做的 自认为比他这个好
FAT和FAT32不支持大于4G的文件
小问题一枚: 当你的U盘实际容量大于4g ,在传输文件的时候,提示FAT32不支持4g以上大文件时候设置一下就好! 打开 开始------程序-----------附件--------命令提示符,输入CONVERT E: /FS:NTFS 即可转换成NTFS分区。
delphi获取大于4G文件的大小
function GetSingleFileSize(const FileName: String): Int64;var? hFile: THandle;? FileSize: Int64Rec;begin? hFile:=_lopen(PChar(FileName), OF_READ);??? //得到文件句柄? FileSize.Lo := GetFileSize(hFile, @File...
linux fopen打开大于4G的文件 失败
用fopen函数打开一个大于4G的文件失败,解决方法:在makefile编译选项里加上如下选项:-D_GNU_SOURCE -D_XOPEN_SOURCE=600 -D_LARGEFILE_SOURCE-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64当然还有其他的方法(出自某哥的博客),比如:正常32位linux系统打开大于2G的文件会报错,解决办法:一、定...
大于4G的文件,用fopen打开有错
rtrnthanks
局域网文件传输1.0 支持大于4G的文件
此为程序,没有源码。 主打功能是文件传输,附加了两个小功能,按F1试试。
用FTP下载大于4G的文件出错!
如果你下载大于4G的文件,他只下载文件的一部分,即:下载大小=实际大小%4G(求模),为什么?
32位linux读写大于4G文件
我在gcc 版本 4.3.3 (Ubuntu 4.3.3-5ubuntu4) 上要读写一个超过4G的文件。已有一个7G的文件temp,现在要把该文件进行一些处理生成一个同样大小的文件temp1。要随机读取rn在程序中已加入以下宏rn#define _FILE_OFFSET_BITS 64rn#define __USE_LARGEFILE64rn#define _LARGEFILE64_SOURCE rnrnrn#include rnrnint main(int argc,char *argv[])rnrn FILE *fin,*fout;rn if((fin=fopen64("temp","r"))==NULL)rn rn printf("打开源文件失败\n");rn return 0;rn rn elsern rn printf("打开源文件成功\n");rn rnrn if((fout=fopen64("temp1","w+"))!=NULL)rn rn printf("创建目的文件成功\n");rn rn for(j=0;j<430;j++)rn rn for(k=0;k<2048;k++)rn rn fseeko64(fin,(k*2048*430+j*2048)*psize,SEEK_SET);rn printf("Location is %lld\n",ftello64(fin));rn rn rn rn我想看一下每次指针是否能定位到相应的位置上,但发现现在fopen64打开temp和创建temp1都没问题,但fseeko64到超过2G的位置,就会出错。谁知道怎么修改呢?是不是我少加了什么宏呢
usb无法传输大于4g文件怎么办?
win+R快捷键在命令行模式下输入: convert g:/fs:ntfs 其中g为u盘所在盘符
通过日志恢复被删除的文件(包括大于4G的文件)
本套教程分理论课和实战课,其中理论课是讲数据存储的结构 。实战课是实际演示数据恢复过程,实战课会用课堂练习.vhd和课后练习.vhd 这两个虚拟磁盘镜像文件,您可以把这两个文本在自己的电脑加载然后,自己动手恢复一遍。如果能一次性恢复成功好,如果恢复不出来,那么再看下课后练习里面的视频教程讲解。如果看了视频后实在还是搞不懂的可以留言咨询我。
文件映射问题
现在一段程序中使用了文件映射,但是郁闷的是,我累加它调用的MapViewOfFile()的最后一个参数,结果发现这个累加结果竟然不是文件长度,而是比文件长度长了接近一倍?rnrn 请问这个是怎么回事?rn 这个MapViewOfFile只在一处被调用,所以,这个不会统计错的。rn rn
关于 映射 文件 的 问题?
当创建 进程 的 时候 ;进程 的 地址 空间 是 从 那 分配 的?rn当 运行 的 时候 ;是 将 这个 进程 的 exe 文件 所在 的 位置 确定 为 进程 的 4G地址 空间 吗?rn rn文件 映射 是 将 硬盘 上 文件(可能是一部分) 映射 到 进程 的 地址空间;这里的 映射 是 将 硬盘 文件 的 首地址 放进 进程 地址 空间? ;还是 真的 将 硬盘 文件 拷 进 进程 空间(2GB 可用 空间)?rn rn能 简单 说 一下 过程吗?rn rncreatefile()应该 是 打开 硬盘 上 文件 ;(主要 是 确定 硬盘 文件 的 位置)rn rncreatefilemapping()这个函数 主要 目的 是 有 足够 的 物理存储器 可以 供 文件 映射 对象 使用;rn rn物理存储器 是 指 什么?(是 进程 的 空间 吗?)rn rn 文件 映射 对象 是 指 什么?rn rnmapviewfile()( 主要 是 为 文件 的 数据 预定 一块 地址空间; 并 将 文件 的 数据 做 为 物理 存储 器 拨给 该 区域。) 既然 是 映射 (我 猜 是 获得 硬盘 文件 的 首地址 ;进行 读 ;为什么还 要 预定 一块 地址空间?)
关于文件映射的问题
我在多个线程不断处理2G以上的文件时候 应用文件映射内存的方式来读取文件【只有读取操作无写操作】rn没个线程在处理一个文件的时候大概是这样的过程rnrn1.每次映射6M到内存,读取完6M后循环 再读取后面6M这样循环知道读完文件rn大概是这样一个过程代码没贴出,简单写下。rnrnMappedByteBuffer buffer =nullrnrnfor(int i=0; i<1000;i++)rn start + 6000000;rn buffer = fileChannel.map (FileChannel.MapMode.READ_ONLY, strat, 6000000);rn read(buffer);rn buffer.clear()rnrnrnrn这就出个问题,我发现内存会不够用,貌似每次的buffer都是新建一个,而旧的并没有清空。而每次循环玩一次我都调用了rnbuffer.clear()rnrn高手分析下问题出在哪? 在线等
关于文件映射问题
请问各位高手,怎样在文件映射视图里写入数据,请指教。
文件映射的问题
用CreateFileMapping映射一个本地的文件,然后不断的更新这个文件。另一台同局域网的电脑也用这种方法映射该文件,但是却无法看到该文件的变化,只有在本地close掉后,才会出现一次变化,如果换成本地可以完整地反映出这些更新变化.rnrn请问高人这是什么原因?如何解决?
mmap文件映射的问题
mmap()是不分配内存的?那么,把文件映射之后,如果被映射的文件被更改了,或者被删除了,mmap()返回的结果还正确可靠么?
有关文件映射的问题
我想让两个文件同步。rn采用了以下的方法:rnrn分别为两个文件建立了文件映射,此时,如果源文件的长度没有变化,只是内容发生了变化,则目标文件在进行FlushViewOfFile后一切OKrnrn但如果源文件的长度变了,如增加了一些内容,目标文件在进行FlushViewOfFile后发现目标文件没有得到更新。rnrn请问各位如何解决这个问题
虚拟内存和文件映射的问题
请教各位高人,在对比较大的位图操作时,例如要开发一个CAD软件,在内存管理上是使用虚拟内存好呢还是文件映射好,能不能请各位分析一下各自的优劣。
文件映射与内存的问题
文件映射占不占用内存呢?rn要是占用,是哪个函数会占用?
文件映射与CString的问题
今天用文件映射把ASCI文本文件读出后想显示在对话框上的一个Edit控件中 ,但缺发现了怪问题。因为我在VC下做过同样的事情很正常 ,但在EVC下缺很纳闷。rn1.首先是如果我直接用程序中段2的程序 ASC2UCS(pFileMem , m_strDest.GetBuffer(0));可以将文件内容正确显示在Edit控件中 ,但却发现UpdateData(FALSE)以后就不能按OK键退出对话框了。只能按X退出,如果先按OK再看X结束的时候就会提示“致命程序错误”的消息对话框。一开始我以为是没释放CString的缓冲造成的,但是我在OnDestroy里ReleaseBuffer后还是一样。rn2.我用了一个String指针对象接受了CString的内容后来显示,但Edit上却什么都不显示rnrn以下是详细程序,只要在基于对话框的工程里加一个按钮和一个Edit控件就可以运行以下程序了。rnrn//ANCII CONVERT TO UNICODErnint CMemMapDlg::ASC2UCS(char *pASC,wchar_t* pUCS)rnrn int len = 0;rnrn if(pUCS == NULL || pASC == NULL)rn return -1;rn rn len = MultiByteToWideChar(CP_ACP,0,pASC,-1,NULL,0);rn MultiByteToWideChar(CP_ACP,0,pASC,-1,pUCS,len);rn len--;rn return len;rnrnrn//把文件内容映射到Edit控件中rnvoid CMemMapDlg::OnRead() rnrn // TODO: Add your control notification handler code herern HANDLE hFile, hFileMap;rn PCHAR pFileMem;rn TCHAR szFileName[MAX_PATH];rn // Get the filename.rn lstrcpy(szFileName , _T("\\test1.txt"));rn hFile = CreateFileForMapping (szFileName , GENERIC_WRITE | GENERIC_READ, rn FILE_SHARE_READ, NULL, rn OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); rn hFileMap = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, _T("MYSHARE"));rn CloseHandle (hFile);rn if (hFileMap) rn pFileMem =(PCHAR)MapViewOfFile (hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);rn if (pFileMem) rn /*rn * 注:rn * m_strDest是对话框上一个Edit控件绑定的CString变量rn */rn rn /*rn * 程序段1rn * 虽然能正常运行 ,但是在Edit里却不显示结果rn *rn *rn */rn //LPTSTR lpText = m_strDest.GetBuffer(0);rn //ASC2UCS(pFileMem , lpText);rn //m_strDest = lpText;rn //m_strDest.ReleaseBuffer(0);rn //UpdateData(FALSE);rn rn /*rn * 程序段2 rn * 能将ASCI文件显示到Edit控件中 ,但发现不能按对话框rn * 上的OK键退出程序了 ,按X倒能退出 ,是否是因为没有ReleaseBufferrn * 造成的? 但这个时候如果加了ReleaseBuffer , 同样会发生不显示结果rn * 的状况。rn */rn //ASC2UCS(pFileMem , m_strDest.GetBuffer(0));rn //UpdateData(FALSE);rnrn UnmapViewOfFile (pFileMem);rn rn CloseHandle (hFileMap);rn rnrn /*rn * 程序段3rn * 如果直接给Edit赋值 ,并且更新不会有任何问题 rn */rn //LPTSTR lpText = _T("hello");rn //m_strDest = lpText;rn //MessageBox(m_strDest);rn //UpdateData(FALSE);rn
内存文件映射的问题
[code=c]rnrn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrnrnrnint main(int argc, char *argv[])rnrn int fd;rn off_t length;rn char *addr;rn char *inserted = "awdawdasdadw啊我大王的哇啊伟大我的哇awdawdawdasdawdadafdaw124234\n"; // this str will be inserted to the filern rn fd = open("abc.txt", O_RDWR | O_CREAT, 0644);rn rn length = lseek(fd,0,SEEK_END);rn addr = (char *)mmap(NULL,4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);rn for (int i = 0;i < 30;i++)rn rn memcpy(addr + length, inserted, strlen(inserted));rn length += strlen(inserted) + 1;rn rn //printf("addr: %s", addr);rn rn munmap((void *)addr, length);rn close(fd);rnrnrn[/code]rnrn为什么 length = lseek(fd,0,SEEK_END); 的返回值不正确? 我创建的空白文件rnmemcpy(addr + length, inserted, strlen(inserted)); 这里怎么崩溃了呐?
文件映射内存共享问题
小弟有一个文件映射内存共享程序 执行的结果是:不管我输入多少字符,最后我从共享内存中读取的只有前4个字符不知道为什么?希望高手指点。谢谢rn程序大致如下:rnwrite=CreateThread(NULL,0,write1,NULL,0,&writeid);rnread=CreateThread(NULL,0,read1,NULL,0,&readid);rnDWORD WINAPI write1(LPVOID pId)rnrn....rnHANDLE hRecvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT,0,1024,"MySharedMem");rn if (hRecvMap != NULL)rn rn lpData = (LPBYTE)MapViewOfFile(hRecvMap, FILE_MAP_WRITE,0,0,1024);rn if (lpData == NULL)rn rn CloseHandle(hRecvMap);rn hRecvMap = NULL;rn rn rn cin>>buffer;rn memcpy(lpData, buffer, sizeof(buffer));rn UnmapViewOfFile(lpData);rn// CloseHandle( hRecvMap );rn....rnrnrnDWORD WINAPI read1(LPVOID pId)rn.....rnHANDLE m_hReceiveMap = OpenFileMapping(FILE_MAP_READ, FALSE, "MySharedMem");rn if (m_hReceiveMap == NULL)rn return -1;rn LPBYTE m_lpbReceiveBuf = (LPBYTE)MapViewOfFile(m_hReceiveMap,FILE_MAP_READ,0,0,1024);rn if (m_lpbReceiveBuf == NULL)rn rn CloseHandle(m_hReceiveMap);rn m_hReceiveMap=NULL;rn rn memcpy(RecvBuf, m_lpbReceiveBuf, 256);rn cout<
装系统磁盘大于4G
按shift+F10进命令行,输入diskpart回车。选择第一个硬盘:select disk 0选择第一个分区:select partition 1删除第一个分区:delete partition override建efi系统分区,大小200M:create partition efi size=200把剩余空间分配完:create partition primary退出命令行exitexit ...
备份文件大于4G怎么办?
数据库是9i,我在客户端用8i的data manager备份到本机,因为是fat32,dmp文件超过了4个g,总是出错,怎样解决?rn如果一个表一个表备份的话好像一次只能备份一个表,有没有办法一次性多选几个表备份?rn另外,如果客户端是9i,用哪个工具进行备份呢?rn谢谢!
文件映射
一.文件映射步骤 1.1打开或创建文件              CreateFile()    1.2创建内存映射     HANDLE CreateFileMapping(文件句柄,安全属性,访问方式,            文件大小的高32= 0,文件大小的低32,映射命名)    1.3加载内存映射文件     LPVOID MapViewOfFile(内存映射句柄,访问模...
读写4G以上文件
由于程序的要求,我要分割读取文件,文件大小不定的,所以有可能大于4G. rn这时我的代码 rn static char temp[1048576]; rnint time, rem; rnifstream readFile(FilePath, ios::binary); rnif (!readFile.is_open()) rn rnthrow exception(); rn rnreadFile.seekg(0, ios::end); rnlong size = readFile.tellg(); rnreadFile.seekg(0,ios::beg); rntime = size/1048576; rnrem = size%1048576; rnfor(int i=1; i <=time; i++) rn rnreadFile.read(temp, 1048576); rnif(readFile.fail() || readFile.bad()) rn rnthrow exception(); rn rn rnreadFile.read(temp, rem); rnif(readFile.fail() || readFile.bad()) rn rnthrow exception(); rn rn会出问题,因为tellg好像返回是long,不可能读到4G以上.所以得用其它方法有人对这方面熟不?WINDOWS API也行,由于项目非常急,希望能得到你的帮助,谢谢
Linux打开大于4G文件有何方法
Linux下fopen 能访问的最大文件大小是多少啊?rn如果想要访问大于4G的文件 rn改如何做? rnrn谢谢rn
请问大于4G文件的操作的函数?windows的,不要mfc
请问大于4G文件的操作的函数?windows的,不要mfc的类。rnfstream貌似只能2G大小,里面参数都是long型的。
大于4G的文件如何全部读入内存?[请高手指点]
各位好,现在遇到一个大文件处理的问题,需要将大于4G的文件全部读入内存,然后对内存的数据进行检查校验,如果有不符合规则(校验规则比较简单)的数据,则该文件无效。 rn请问,这应该怎么处理好?(生产环境是64位系统,64G内存小型机)
求c语言 读大于4g文件 的方法代码
我做一个小程序是用来算文件的哈希值的 可是用普通的读写方法 rnFILE * fp;rnfp = fopen(FileName,"rb"))!=NULLrn好像不能读大于4g的文件
破解百度网盘不能上传大于4G的文件方法
破解百度网盘不能上传大于4G的文件方法
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池