如何使用AsyncSocket通过网络传输大型文件/目录

时间:2012-01-11 05:18:09

标签: objective-c cocoa ftp asyncfileupload cocoaasyncsocket

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

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

1 个答案:

答案 0 :(得分:3)

我想我明白了。我不得不用小字节大小(HAHA GET THE PUN?)片段将它读入内存并通过这种方式传输。请记住,这仅适用于文件,而不适用于目录。我在一个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];