文件大小消失 我用内存映射做文件传输。当单个文件达到2G传输的时候,传输数据都完后,这个文件原来是有内容的,可是显示的大小既然是空的这个是怎么回事呢?谁有遇到过这种问题呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是传完 文件提示都成功了 我到文件夹下看属性是0字节可是我传的是2G以下的文件都是OK的 很奇怪的问题 WINXP FAT32是不是跟机子的内存什么有关系呢?我是2G的内存 所以是不是2G以内的就没问题呢? 操作系统和文件系统没问题,与物理内存也没有必然联系,是你的程序中某个地方失败了吧?如果你在MapViewOfFile时指定大小为2GB,肯定是会失败的,因为用户地址空间总共只有2GB,不可能完全映射,最多的时候也只能映射到1.5GB左右。 获取大文件的大小要检查高32位数据。DWORD WINAPI GetFileSize( __in HANDLE hFile, __out_opt LPDWORD lpFileSizeHigh); 按你说法,限制是在4G而不是2G,难道是32位WINDOWS系统限制? 与32位WINDOWS系统限制肯定有关.建议参考一下8楼意见. 要使用 NTFS 才能使用大于 2G 的单个文件。 FAT32在Windows上可以支持4G以下的文件的。 如果真是这样,64位WINDOWS终于可以发挥了。 m_nfilesize=GetFileSize(m_hFile,NULL);我获取文件大小是这样写 这样有问题吗? FAT32不支持超过2G的文件,直接使用微软的拷贝也能说明这个问题。 单个文件大小不超过4G 之所以FAT32限制4G,是因为记录文件大小的是一个unsigned long,其最大值就是2^32=4*1024*1024*1024 网上是这样说的 http://blog.chinaunix.net/u/5958/showart_162284.html这两天用到了内存映射文件。突然想到了这个问题,仔细想了一下,查找了相关的资料,整理如下: 1,内存映射文件应该映射到内存的堆与栈之间的空闲区域内,应该理解为放在堆上,理由为: (1),栈的管理方式采用先进先出的方式,所以程序在运行的特定时刻,其栈是固定的。 (2),堆的管理方式比较灵活,可以理解为堆的开始到栈顶都属于堆的可用空间,当然可用空间内可能有碎片,碎片的意思是小的没用用到的内存,这可能是由于先new后delete造成的。 (3),比较两者的管理方式,内存映射文件只能映射到堆上。 2,在32位机器上,内存映射文件的大小可以超过2G,但是内存映射文件映射到内存的大小却不能超过2G。因为程序空间为4G,但是高地址的2G已经让内核占用,不能再另做他用,所以程序实际可用空间不超过2G,除去TEXT段等,所剩给堆和栈共用的空间就小于2G,所以限制了映射到内存的内容的大小。为了能够解决这个冲突,windows引入了View的思想,其实就是一个窗口(类似于MFC中的VIEW),一次将窗口内可见的内容映射到内存,当然窗口的大小不可能超过2G。在网上看到这边资料 不知道是不是对的 如果是这样的话 那我也是内存映射 那我传输一个2G文件该怎么处理呢 谁有碰到过 出来帮忙解决下。 内存映射是把文件映射到进程的内存地址空间,Win32 下进程最大可访问内存空间为 4G,而属于进程私有的空间大小最大只有 2G.你可以分次映射,先映射文件 0 - 1G,再 1G - 2G , ... UnmapViewOfFile(PerIoData->filemanage->m_pvFile);if((PerIoData->filemanage->m_nfilesize-PerIoData->filemanage->m_nfileoffset)>MAX_FILE_OPEN){ PerIoData->filemanage->m_pvFile=MapViewOfFile(PerIoData->filemanage->m_hFileMAP, FILE_MAP_WRITE,0, PerIoData->filemanage->m_nfileoffset, MAX_FILE_OPEN); PerIoData->filemanage->m_nfileMapView=MAX_FILE_OPEN;}else{ PerIoData->filemanage->m_pvFile=MapViewOfFile(PerIoData->filemanage->m_hFileMAP, FILE_MAP_WRITE,0, PerIoData->filemanage->m_nfileoffset, 0); PerIoData->filemanage->m_nfileMapView=PerIoData->filemanage->m_nfilesize-\ PerIoData->filemanage->m_nfileoffset; }我有开辟一新的映射视图,来防止数据溢出 可是2G还是会 不知道为什么 OnCtlColor调用 救急!VC++实现打印网页 我在CListView里添加的条目为什么 不显示? 请教: 类的静态成员变量赋值的问题 如何得到ODBC数据源的数据库类型? 求助各路大神有没有关于制作GIF图片的C++类库,有的话请不吝赐教,谢谢了! 过180s,让线程继续运动用settimer怎么实现 怎样将两个字符合并成一个ASCII字符 我想用ORPC代替网络编程不知行得通否? 两个问题(我很穷,没有分了,希望,大家不要怪) wchar_T和char互转问题。 如何防止生成的文件覆盖源文件
可是我传的是2G以下的文件都是OK的 很奇怪的问题
是不是跟机子的内存什么有关系呢?我是2G的内存 所以是不是2G以内的就没问题呢?
DWORD WINAPI GetFileSize(
__in HANDLE hFile,
__out_opt LPDWORD lpFileSizeHigh
);
难道是32位WINDOWS系统限制?
FAT32在Windows上可以支持4G以下的文件的。
我获取文件大小是这样写 这样有问题吗?
之所以FAT32限制4G,是因为记录文件大小的是一个unsigned long,其最大值就是2^32=4*1024*1024*1024 网上是这样说的
这两天用到了内存映射文件。突然想到了这个问题,仔细想了一下,查找了相关的资料,整理如下:
1,内存映射文件应该映射到内存的堆与栈之间的空闲区域内,应该理解为放在堆上,理由为:
(1),栈的管理方式采用先进先出的方式,所以程序在运行的特定时刻,其栈是固定的。
(2),堆的管理方式比较灵活,可以理解为堆的开始到栈顶都属于堆的可用空间,当然可用空间内可能有碎片,碎片的意思是小的没用用到的内存,这可能是由于先new后delete造成的。
(3),比较两者的管理方式,内存映射文件只能映射到堆上。
2,在32位机器上,内存映射文件的大小可以超过2G,但是内存映射文件映射到内存的大小却不能超过2G。因为程序空间为4G,但是高地址的2G已经让内核占用,不能再另做他用,所以程序实际可用空间不超过2G,除去TEXT段等,所剩给堆和栈共用的空间就小于2G,所以限制了映射到内存的内容的大小。为了能够解决这个冲突,windows引入了View的思想,其实就是一个窗口(类似于MFC中的VIEW),一次将窗口内可见的内容映射到内存,当然窗口的大小不可能超过2G。
在网上看到这边资料 不知道是不是对的
如果是这样的话 那我也是内存映射 那我传输一个2G文件该怎么处理呢
谁有碰到过 出来帮忙解决下。
if((PerIoData->filemanage->m_nfilesize-PerIoData->filemanage->m_nfileoffset)>MAX_FILE_OPEN)
{
PerIoData->filemanage->m_pvFile=MapViewOfFile(PerIoData->filemanage->m_hFileMAP,
FILE_MAP_WRITE,0,
PerIoData->filemanage->m_nfileoffset,
MAX_FILE_OPEN);
PerIoData->filemanage->m_nfileMapView=MAX_FILE_OPEN;
}
else
{
PerIoData->filemanage->m_pvFile=MapViewOfFile(PerIoData->filemanage->m_hFileMAP,
FILE_MAP_WRITE,0,
PerIoData->filemanage->m_nfileoffset,
0);
PerIoData->filemanage->m_nfileMapView=PerIoData->filemanage->m_nfilesize-\
PerIoData->filemanage->m_nfileoffset;
}
我有开辟一新的映射视图,来防止数据溢出 可是2G还是会 不知道为什么