在C / C ++中创建填充零的1GB文件的最快方法是什么?

时间:2012-03-21 17:11:44

标签: c++ windows file-io

我需要在Windows操作系统中创建一个填充零的巨大二进制文件。它的大小是给定的。在C / C ++中最有效的方法是什么?

5 个答案:

答案 0 :(得分:6)

尝试拨打truncate(2)

truncate("/my/file", my_size);

欲了解更多信息,

man 2 truncate
  

truncate()和ftruncate()函数导致由path命名或由fd引用的常规文件被截断为精确长度字节的大小。

     

如果之前的文件大于此大小,则额外数据将丢失。如果之前的文件较短,则会进行扩展,扩展部分将读取为空字节('\ 0')。

如果您正在寻找Windows原生功能,请查看SetEndOfFile,它的功能大致相同。

答案 1 :(得分:5)

如果文件确实需要全为零,那么除了写入所有数据之外别无他法。我可能会使用与驱动器块大小相同大小的缓冲区,并将其写入循环,直到您写入所需的大小。

如果文件中包含未定义数据的“漏洞”(磁盘上已有的内容),您可以寻找指定的大小并写入一个字节。

答案 2 :(得分:1)

“最快”与平台有关。在unix上,使用open和write系统调用;一定要用大缓冲区调用write(~1MB)。

答案 3 :(得分:1)

如果有人想知道我如何解决我的问题:

void CreateBlankFile(LPSTR str, long lsize) {
    DWORD dwErr;
    HANDLE file = CreateFile(str, 
                             GENERIC_WRITE,
                             FILE_SHARE_WRITE,
                             NULL,
                             CREATE_ALWAYS,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);
    dwErr = GetLastError();
    if (dwErr > 0) {
        //some error message should be here
        return;
    }
    SetFilePointer(file, lsize, 0, FILE_BEGIN);
    SetEndOfFile(file);
    CloseHandle(file);
}

答案 4 :(得分:0)

也许这就是您正在寻找的SPARSE文件。这些类型的文件通常由文件共享程序创建......

http://www.flexhex.com/docs/articles/sparse-files.phtml