在 Windows 上创建大文件应该没有任何问题,但我注意到,如果您在文件上使用 32 位版本的 seek,那么它似乎会确定它是 32 位文件,因此不能大于 4GB。在 Windows 上处理 >4GB 文件时,我已经成功使用 _open、_lseeki64 和 _write。例如:
static void
create_file_simple(const TCHAR *filename, __int64 size)
{
int omode = _O_WRONLY | _O_CREAT | _O_TRUNC;
int fd = _topen(filename, omode, _S_IREAD | _S_IWRITE);
_lseeki64(fd, size, SEEK_SET);
_write(fd, "ABCD", 4);
_close(fd);
}
以上将毫无问题地创建一个超过 4GB 的文件。但是,它可能会很慢,因为当您在那里调用 _write() 时,文件系统必须实际为您分配磁盘块。如果您必须随机填充它,您可能会发现创建稀疏文件更快。如果您从头开始按顺序填充文件,那么上面的代码就可以了。请注意,如果您真的想使用 fwrite 提供的缓冲 IO,您可以使用 fdopen() 从 C 库文件描述符中获取 FILE*。
(如果有人想知道,TCHAR、_topen 和下划线前缀都是 MSVC++ 的怪癖)。
更新
最初的问题是对值 V 的 N 个字节使用顺序输出。因此,一个实际应该生成所需文件的简单程序是:
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <io.h>
#include <tchar.h>
int
_tmain(int argc, TCHAR *argv[])
{
__int64 n = 0, r = 0, size = 0x100000000LL; /* 4GB */
char v = 'A';
int fd = _topen(argv[1], _O_WRONLY | _O_CREAT| _O_TRUNC, _S_IREAD | _S_IWRITE);
while (r != -1 && n < count) {
r = _write(fd, &v, sizeof(value));
if (r >= 0) n += r;
}
_close(fd);
return 0;
}
但是,这将非常慢,因为我们一次只写入一个字节。这可以通过使用更大的缓冲区或通过在描述符 (fd) 上调用 fdopen 并切换到 fwrite 来使用缓冲 I/O 来改进。