我需要能够快速创建一个大的“虚拟”文件(大约1 GB)。我目前正在循环一个字节数组并将其附加到文件,但这可能会导致磁盘命中:
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path];
[handle seekToEndOfFile];
while (shouldContinue)
{
NSData *dummyData = [self buildDummyData];
[handle writeData:dummyData];
}
但这需要大约7秒才能完成。我希望它在不到1秒钟内完成。有没有办法创建文件并分配其大小而无需向其追加字节?
答案 0 :(得分:6)
您可以使用truncate
直接设置文件的长度:
int success = truncate("/path/to/file", 1024 * 1024 * 1024);
if (success != 0) {
int error = errno;
/* handle errors here. See 'man truncate' */
}
答案 1 :(得分:2)
You can check this answer。它说你可以lseek()超过文件末尾(EOF)然后写一些东西。如果查询,文件的初始结尾与您编写的字节之间的差距将返回0。
答案 2 :(得分:1)
如果您想留在Objective-C中,请像在示例中一样使用NSFileHandle
:
NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:dummyFilePath];
if (file == nil) {
[[NSFileManager defaultManager] createFileAtPath:dummyFilePath contents:nil attributes:nil];
file = [NSFileHandle fileHandleForWritingAtPath:dummyFilePath];
}
[file truncateFileAtOffset:sizeInMB * 1024 * 1024];
[file closeFile];
请注意,这是 sloooow 。写1GB文件对我来说需要30秒以上。
另一种方法是写一下:
[file seekToFileOffset:sizeInMB * 1024 * 1024];
const unsigned char bytes[] = {1};
[file writeData:[NSData dataWithBytes:bytes length:sizeof(bytes)]];
这对我来说更慢,1GB需要55秒。