我已经尝试过 NSTask > NSData 方法,但是对于超过 1GB 的任何东西,CPU/内存开销都非常大,所以我需要找到一种方法来做到这一点,比如 FTP 服务器可以做到这一点。
编辑:远程桌面的复制文件是如何做到的?
我已经尝试过 NSTask > NSData 方法,但是对于超过 1GB 的任何东西,CPU/内存开销都非常大,所以我需要找到一种方法来做到这一点,比如 FTP 服务器可以做到这一点。
编辑:远程桌面的复制文件是如何做到的?
我想我明白了。我必须将它以小字节大小(哈哈明白双关语?)片段读入内存并以这种方式传输。请记住,这仅适用于文件,而不适用于目录。我在一个 450MB 的文件上对其进行了测试,它在大约 3 分钟内完成了复制,其字节数与源文件完全相同。这是一个视频,当我将它流式传输到客户端时,我也可以播放它。漂亮,对吧?
事不宜迟,这是我使用的代码,稍作修补以进行简单的文件复制,而不是通过网络复制。
[[NSFileManager defaultManager] createFileAtPath:@"/path/to/file/dest" contents:nil attributes:nil];
NSFileHandle *output = [NSFileHandle fileHandleForWritingAtPath:@"/path/to/file/dest"];
uint64 offset = 0;
uint32 chunkSize = 8192;
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:@"/path/to/file/source"];
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
NSData *data = [handle readDataOfLength:chunkSize];
NSLog(@"Entering Loop.");
while ([data length] > 0) {
[output seekToEndOfFile];
[output writeData:data];
offset += [data length];
NSLog(@"Switching Loop.");
[autoreleasePool release];
autoreleasePool = [[NSAutoreleasePool alloc] init];
[handle seekToFileOffset:offset];
data = [handle readDataOfLength:chunkSize];
}
NSLog(@"Exited Loop.");
[handle closeFile];
[autoreleasePool release];
[output closeFile];
[output release];