代码之家  ›  专栏  ›  技术社区  ›  Ilya

在Windows上创建大文件

  •  15
  • Ilya  · 技术社区  · 16 年前

    谢谢

    6 回复  |  直到 16 年前
        1
  •  28
  •   Brian R. Bondy    16 年前

    使用Win32 API, CreateFile SetFilePointerEx , SetEndOfFile CloseHandle

    诀窍在于SetFilePointerEx函数。从MSDN:

    指向超出范围的位置的文件指针 文件的结尾。大小 在调用之前,文件不会增加 SetEndOfFile、WriteFile或 WriteFilex函数。

        2
  •  3
  •   Laserallan    16 年前

    退房 memory mapped files .

    我相信它们不需要创建为大文件。您只需在它们上设置一个较大的最大大小,当您写入以前从未接触过的部分时,它们将被扩展。

        3
  •  2
  •   Community CDub    8 年前

    this SetFileValidData

    正如MSDN所说:

    SetFileValidData函数允许您避免使用

    所以这总是让磁盘数据保持原样, SetFilePointerEx

        4
  •  1
  •   opal    14 年前

    使用“fsutil”命令:

    E:\VirtualMachine>fsutil文件createnew 例如:fsutil文件createnew C:\testfile.txt 1000

    雷格斯

    另外,它适用于Windows:2000/XP/7

        5
  •  0
  •   Stu Mackellar    16 年前

    sparse files 我们的道路是:

    包含大量数据的文件 零被称为包含稀疏数据 设置像这样的文件通常是 包含要处理的图像数据 数据库文件的问题 该文件的大部分内容都没有 这是一种低效率的使用方法 磁盘空间。

    NTFS文件中的文件压缩 问题文件中的所有数据 不显式编写就是显式编写 设置为零。文件压缩压缩压缩 这些是零的范围。但是,

    介绍了对稀疏文件的支持 在NTFS文件系统中作为另一种方式 提高磁盘空间使用率 有效率的当稀疏文件 启用功能后,系统 不将硬盘驱动器空间分配给 包含非零数据。当一个人写 尝试在发生大错误时执行操作 零,零不被写入 档案。相反,文件系统 中零的位置 文件,并参考此列表 在所有读取操作期间。当 在区域中执行读取操作 零所在的文件的, 文件系统返回 为读取分配的缓冲区 稀疏文件对所有人都是透明的 访问它的进程,以及更多 在这方面比压缩更有效 特定场景。

        6
  •  0
  •   Community CDub    8 年前

    我知道你的问题被贴上了Windows标签,Brian R.Bondy为你的问题提供了最好的答案,如果你确定你不必将应用程序移植到其他平台。但是,如果您可能需要将应用程序移植到其他平台,您可能需要做一些更像Adrian Cornish提出的问题,即“如何创建x大小的文件?”的答案 How to create file of "x" size?

    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。不幸的是,在不同的平台上,它有不同的名称。

    在中找到头文件LargeFileSupport.h http://mosaik-aligner.googlecode.com/svn-history/r2/trunk/src/CommonSource/Utilities/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);
    }
    

    我想我会加上这个,以防这些信息对你有用。