2

我已经尝试过 NSTask > NSData 方法,但是对于超过 1GB 的任何东西,CPU/内存开销都非常大,所以我需要找到一种方法来做到这一点,比如 FTP 服务器可以做到这一点。

编辑:远程桌面的复制文件是如何做到的?

4

1 回答 1

3

我想我明白了。我必须将它以小字节大小(哈哈明白双关语?)片段读入内存并以这种方式传输。请记住,这仅适用于文件,而不适用于目录。我在一个 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];
于 2012-01-11T07:31:17.000 回答