我需要在Windows操作系统中创建一个填充零的巨大二进制文件。它的大小是给定的。在C / C ++中最有效的方法是什么?
答案 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
文件。这些类型的文件通常由文件共享程序创建......