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

What's the fastest way to create 1GB file filled with zeros in C/C++?

本文关键字:文件 1GB 方法 是什么 满零 C++ 创建      更新时间:2023-10-16

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

尝试调用truncate(2):

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

更多信息,

man 2 truncate

truncate()和ftruncate()函数会将按路径命名或由fd引用的常规文件截断为精确长度的字节大小。

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

如果您正在寻找Windows本机函数,请查看SetEndOfFile,它的作用大致相同。

如果文件真的需要全为零,那么除了写入所有数据之外,没有其他方法了。我可能会使用与驱动器块大小相同的缓冲区来完成这项工作,并在循环中写入,直到写入到您想要的大小。

如果该文件可以包含";孔";在数据未定义的地方(实际上磁盘上已经有什么了),可以查找指定的大小并写入一个字节。像这样的洞实际上会被读取为零。

如果有人想知道我是如何在这里解决问题的:

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);
}

"Fastest"依赖于平台。在unix上,使用开放和编写系统调用;请确保使用大缓冲区(~1MB)调用write。

也许这就是您想要的SPARSE文件。这些类型的文件通常由文件共享程序创建。。。

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