windows 在C/C++中创建1GB文件并填充零的最快方法是什么?[已关闭]

68bkxrlz  于 2023-02-10  发布在  Windows
关注(0)|答案(5)|浏览(186)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

3天前关闭。
Improve this question
我需要在Windows操作系统中创建一个巨大的二进制文件,文件的大小是给定的,在C/C++中最有效的方法是什么?

56lgkhnf

56lgkhnf1#

请尝试拨打truncate(2)

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

如需了解更多信息,

man 2 truncate

truncate()和ftruncate()函数使由path命名或由fd引用的常规文件被截断到精确长度字节的大小。
如果文件先前大于此大小,则会丢失额外的数据。如果文件先前较短,则会对其进行扩展,扩展部分读取为空字节("\0")。
如果您正在寻找Windows本机函数,请查看SetEndOfFile,它的功能大致相同。

06odsfpq

06odsfpq2#

如果文件真的需要全部为零,那么除了写入所有数据外,没有其他方法。我可能会使用与驱动器块大小相同大小的缓冲区,并循环写入,直到写入到所需的大小。
如果文件中包含未定义数据的“空洞”(磁盘上实际上已经存在的数据),你可以查找到指定的大小并写入一个字节,这样的空洞实际上会被读为零。

cs7cruho

cs7cruho3#

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

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

ie3xauqp4#

“最快”依赖于平台,在unix上,使用open和write系统调用;请确保使用较大的缓冲区(~ 1 MB)调用write。

t2a7ltrp

t2a7ltrp5#

也许这就是你要找的SPARSE文件。这些类型的文件通常是由文件共享程序创建的。
http://www.flexhex.com/docs/articles/sparse-files.phtml

相关问题