当前位置:C++技术网 > 资讯 > 如何创建巨大的文件,以及创建巨大文件的原理分析

如何创建巨大的文件,以及创建巨大文件的原理分析

更新时间:2015-06-24 23:48:08浏览次数:1+次

    有时候,我们需要事先创建一个巨大的文件,用于测试或者其他目的。而普通情况下,创建的文件都是空文件,大小为0.而我们需要一次性创建一个巨大的文件比如4GB大小文件。如何实现呢?本文通过MFC和Win32 API函数来讲解这个问题,C/C++语言的实现,原理和这个一样。就不重复讲述。我们现在所讲述的,并不是使用函数,而是文件操作的机制和原理以及为什么大文件可以瞬间创建出来。这部分掌握了,在其他平台,其他库,道理是相同的,只是调用的函数有差异而已。
    创建文件后,会得到一个文件句柄,通过这个句柄,就可以对文件进行操作。为了深入细致的了解,还是用API来讲述。此时,在磁盘中创建了一个空文件。创建文件后,就有一个文件指针来指示操作到文件的哪个地方。移动文件指针就可以对文件不同的位置进行操作,读数据或者写数据等。这样,通过移动文件指针,我们可以在文件的数据中来回操作。这是了解文件操作最基础的部分。如果你对文件指针都不了解,那你就没有了解文件操作。我们现在所讲述的,并不是使用函数,而是文件操作的机制和原理。这部分掌握了,在其他平台,其他库,道理是相同的,只是调用的函数有差异而已。
    文件指针的作用,就是方便文件的操作。这样可以对文件自由的随机读写,只不过,会频繁的进行I/O操作。一般为了提高效率,会自己提供一个缓冲,然后部分读取文件,然后再内存分析,操作完毕后,写回到文件。文件指针实际就是一个变量,记录文件的操作位置而已,所以,在移动指针后不会对文件内容有任何的影响。只是在操作时则是从文件指针指向的位置开始操作。
    所以,对于文件指针,不用畏惧,就跟数组的指针一样,没什么特殊的。理解以上的内容,是文件操作的基础。
    下面开始讲述如何创建大文件的原理。
    一次性创建大文件,大到以TB计算都可以。当然,实际使用时,高到GB就很大了。这和文件指针是有极大的关系。
    我们不可能通过循环的大量写入数据,来达到这么大的文件,这样实在是太耗时间和CPU了。对于瞬间创建大文件,完全就不行。
    创建文件后,文件大小是空的,文件指针指向的位置是0.此时文件虽然是0,但是我们依然可以移动指针。系统有这么一个特性,当文件指针移动超过文件大小时,是完全可以的,而此时对文件进行写入,之前的部分全部为0,文件就是从指针的位置开始写。如果你写入0,则也是瞬间完成的。如果写入的是非零,则需要一些时间。还有一种方法,就是移动文件指针到你需要的大小处,然后设置一个文件结尾。其实也是在最后位置写入0.道理和之前的是一样的。那么问题来了,为什么这样创建文件会在瞬间完成呢?
    此时创建的大文件,是一个稀疏文件。全部是零,开始并没有分配任何磁盘空间,只是在文件系统中记录了一下而已,在操作时才开始分配。这样自然就可以瞬间完成。
    下面通过API来讲述如何实现,代码示例:

/* - 创建一个文件 - */
HANDLE hFile = CreateFile("D:\\test.dat",GENERIC_WRITE | GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL NULL);
/* - 移动文件指针到指定的大小位置 - */
LONGLONG M=1024*1024;
LARGE_INTEGER liMaxSize;liMaxSize.QuadPart = 4 * 1024 *M;// - 4GB
::SetFilePointerEx(hFile,liMaxSize,NULL,FILE_BEGIN);
/* - 设置文件结尾 - */
::SetEndOfFile(hFile);
/* - 关闭文件- */
::CloseHandle(hFile);

    这是API的实现,这个明白了,其他的你也知道了。MFC中的CFile,使用SetLength成员函数,自动完成了移动指针和设置文件结尾两步操作。C/C++语言的操作,原理一样,只是函数名不太一样,就不赘述了。