假如有一个文件有500M或者更大,用FILE类型读取或者FileStream来读取中间的某一段数据(二进制),是否会把整个500M的文件都载入内存中的?如果要在原来500M的文件中插入一段二进制数据,是否也是全部读取500M进内存,然后重新分配新的内存空间,把新的内容放入内存再一起写入文件?如果要实现这类从一个大文件中读取某一段或者插入一段数据,应该要怎么做的?谢谢~

解决方案 »

  1.   

    文件流TFileStream,是以流的方式操作文件,不会把500M都读到内存里的,而是采用缓冲的方式来操作文件,不是一次读入。
    在500M文件中插入一段数据是需要把文件全部读一次的,但不需要都放入内存再一起写入文件。你可以另存为一个文件,然后把原文件删除,再将另存的文件改名。
      

  2.   


    用CreateFileMapping就可以随意在一个大文件里读取和插入数据而不需要把500M都载入内存?
      

  3.   

    内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用
    PS:摘自内存映射文件原来我用过这种方法处理过1G多的文件,很有效
      

  4.   


    现在的游戏用的PAK包也是用这类方法读取的?那些包可以直接把升级的文件插入或替换到包中而不需要解开或重构那个大文件,是否原理也是这类?
      

  5.   

    我原来就用VC做过一个游戏更新的客户端,用的就是用这种方法,文件有1G多