我用内存映射做文件传输。
当单个文件达到2G传输的时候,传输数据都完后,这个文件原来是有内容的,可是显示的大小既然是空的
这个是怎么回事呢?谁有遇到过这种问题呢?

解决方案 »

  1.   

    就是传完 文件提示都成功了 我到文件夹下看属性是0字节
    可是我传的是2G以下的文件都是OK的 很奇怪的问题
      

  2.   

    WINXP FAT32
    是不是跟机子的内存什么有关系呢?我是2G的内存 所以是不是2G以内的就没问题呢?
      

  3.   

    操作系统和文件系统没问题,与物理内存也没有必然联系,是你的程序中某个地方失败了吧?如果你在MapViewOfFile时指定大小为2GB,肯定是会失败的,因为用户地址空间总共只有2GB,不可能完全映射,最多的时候也只能映射到1.5GB左右。
      

  4.   

    获取大文件的大小要检查高32位数据。
    DWORD WINAPI GetFileSize(
      __in       HANDLE hFile,
      __out_opt  LPDWORD lpFileSizeHigh
    );
      

  5.   

    按你说法,限制是在4G而不是2G,
    难道是32位WINDOWS系统限制?
      

  6.   

    与32位WINDOWS系统限制肯定有关.建议参考一下8楼意见.
      

  7.   

    要使用 NTFS 才能使用大于 2G 的单个文件。
      

  8.   


    FAT32在Windows上可以支持4G以下的文件的。
      

  9.   

    如果真是这样,64位WINDOWS终于可以发挥了。
      

  10.   

    m_nfilesize=GetFileSize(m_hFile,NULL);
    我获取文件大小是这样写 这样有问题吗?
      

  11.   

    FAT32不支持超过2G的文件,直接使用微软的拷贝也能说明这个问题。
      

  12.   

    单个文件大小不超过4G 
    之所以FAT32限制4G,是因为记录文件大小的是一个unsigned long,其最大值就是2^32=4*1024*1024*1024 网上是这样说的
      

  13.   

    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文件该怎么处理呢 
    谁有碰到过 出来帮忙解决下。
      

  14.   

    内存映射是把文件映射到进程的内存地址空间,Win32 下进程最大可访问内存空间为 4G,而属于进程私有的空间大小最大只有 2G.你可以分次映射,先映射文件 0 - 1G,再 1G - 2G , ...
      

  15.   

    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还是会 不知道为什么