在Windows上创build大文件

我需要创build一个相对较大(1-8 GB)的文件。 在使用C或C ++的Windows上这样做最快的方法是什么? 我需要在运行中创build它们,速度真的是一个问题。 文件将被用于存储模拟,即将以不同的偏移量随机访问,我需要所有的存储将预分配,但没有初始化,目前我们正在写所有的存储与虚拟数据,它需要太长时间。

谢谢。

Solutions Collecting From Web of "在Windows上创build大文件"

使用Win32 API, CreateFile , SetFilePointerEx , SetEndOfFile和CloseHandle 。 以同样的顺序。

技巧是在SetFilePointerEx函数中。 来自MSDN:

请注意,将文件指针设置为超出文件末尾的位置不是错误。 在调用SetEndOfFile,WriteFile或WriteFileEx函数之前,文件的大小不会增加。

Windows资源管理器在将文件从一个位置复制到另一个位置时实际上也是这样做的。 它这样做,以便磁盘不需要重新分配文件的碎片磁盘。

检出内存映射文件 。

它们非常符合您所描述的用例,高性能和随机访问。

我相信他们不需要被创建为大文件。 你只需在它们上面设置一个大的最大尺寸,当你写下你以前没有碰过的零件时,它们将被扩展。

那么这个解决方案并不坏,但你正在寻找的是SetFileValidData

作为MSDN SAIS:

SetFileValidData函数允许您避免在将文件不连续写入文件时用零填充数据。

所以这总是把磁盘数据保持原样, SetFilePointerEx应该把所有的数据都设置为零,所以大的分配需要一些时间。

如果你使用的是NTFS,那么稀疏文件是一个很好的选择:

据说其中大部分数据是零的文件被认为包含稀疏数据集。 像这样的文件通常非常大,例如包含要处理的图像数据的文件或高速数据库中的矩阵。 包含稀疏数据集的文件的问题是大部分文件不包含有用的数据,因此,它们对磁盘空间的使用效率不高。

NTFS文件系统中的文件压缩是部分解决此问题的方法。 文件中未明确写入的所有数据显式设置为零。 文件压缩压缩这些零的范围。 但是,文件压缩的​​缺点是由于数据压缩和解压缩,访问时间可能会增加。

在NTFS文件系统中引入了对稀疏文件的支持,这是另一种使磁盘空间使用效率更高的方法。 启用稀疏文件功能时,系统不会为文件分配硬盘空间,除非文件包含非零数据的区域。 当缓冲区中的大量数据为零时尝试写入操作时,零不写入文件。 相反,文件系统会创建一个内部列表,其中包含文件中零的位置,并在所有读取操作期间查阅此列表。 当在文件的零区所在的区域执行读操作时,文件系统在分配给读操作的缓冲区中返回适当数量的零。 通过这种方式,稀疏文件的维护对所有访问它的进程都是透明的,对于这种特殊的场景来说,压缩比压缩更有效率。

使用“fsutil”命令:

E:\ VirtualMachines> fsutil文件createnew用法:fsutil文件createnew例如:fsutil文件createnew C:\ testfile.txt 1000

Reagds

PS是用于Windows:2000 / XP / 7

我知道你的问题是用Windows标记的,Brian R. Bondy给出了你的问题的最佳答案,如果你确实知道你不必将你的应用程序移植到其他平台。 但是,如果您可能需要将您的应用程序移植到其他平台,那么您可能需要做一些更像Adrian Cornish所提出的问题,以解决“如何创建”x“大小的文件”的答案。 发现在如何创建“x”大小的文件? 。

 FILE *fp=fopen("myfile", "w"); fseek(fp, 1024*1024, SEEK_SET); fputc('\n', fp); fclose(fp); 

当然,还有一个转折点。 Adrian Cornish提出的答案使用了具有以下签名的fseek函数。

 int fseek ( FILE * stream, long int offset, int origin ); 

问题是你想创建一个文件大小超出32位整数范围的非常大的文件。 你需要使用64位的fseek。 不幸的是,在不同的平台上有不同的名字。

http://mosaik-aligner.googlecode.com/svn-history/r2/trunk/src/CommonSource/Utilities/LargeFileSupport.h找到的头文件LargeFileSupport.h为这个问题提供了一个解决方案。

这将允许你写下面的函数。

 #include "LargeFileSupport.h" /* Include other headers. */ bool createLargeFile(const char * filename, off_type size) { FILE *fp = fopen(filename, "w"); if (!fp) { return false; } fseek64(fp, size, SEEK_SET); fputc('\n', fp); fclose(fp); } 

我想我会补充一点,以防万一信息对你有用。