如何快速在iOS中创build一个大文件

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

NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path]; [handle seekToEndOfFile]; while (shouldContinue) { NSData *dummyData = [self buildDummyData]; [handle writeData:dummyData]; } 

但是这需要大约7秒钟才能完成。 我希望在不到1秒的时间内完成。 有没有办法创build一个文件,并分配其大小,而不需要附加字节?

您可以使用truncate直接设置文件的长度:

 int success = truncate("/path/to/file", 1024 * 1024 * 1024); if (success != 0) { int error = errno; /* handle errors here. See 'man truncate' */ } 

你可以检查这个答案 。 它说,你可以lseek()超过文件​​结尾(EOF)然后写一些东西。 如果查询,文件的最初结尾和写入的字节之间的差距将返回0。

如果你想留在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秒。