如何在iOS中快速创建大文件

时间:2014-01-06 19:31:04

标签: ios objective-c

我需要能够快速创建一个大的“虚拟”文件(大约1 GB)。我目前正在循环一个字节数组并将其附加到文件,但这可能会导致磁盘命中:

NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path];
[handle seekToEndOfFile];

while (shouldContinue)
{
     NSData *dummyData = [self buildDummyData];
     [handle writeData:dummyData];
}

但这需要大约7秒才能完成。我希望它在不到1秒钟内完成。有没有办法创建文件并分配其大小而无需向其追加字节?

3 个答案:

答案 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秒。