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

问题描述:

我已经尝试了NSTask> NSData方法,但CPU /内存开销对于超过1GB的任何内容都非常大,所以我需要找到一种方法来执行此操作,比如说,一台FTP服务器就可以做到。如何通过网络传输大文件/目录使用AsyncSocket

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

+0

我让别人精心制作的官方答案,但这样我会解决问题这样将有一个最大尺寸(一个缓冲,或'NSData'对象),然后执行按顺序增量传输。 – 2012-01-11 05:20:45

+0

由于我的应用程序是一个客户端服务器应用程序,我可以用单一身份验证编写FTP服务器,并让客户端连接到侧面并下载它? – 2012-01-11 05:57:01

+0

确定...你可以做任何你想要的文件传输(FTP,TCP,UDP,两个锡罐和一个字符串连在一起等)。当你是程序员时,你可以决定如何最好地实现文件传输。 :-) – 2012-01-11 06:00:52

我想我明白了。我不得不以小字节大小(HAHA GET 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]; 
+0

您也可以修改chunkSize以适应您的内存占用需求。 :D NSLog()应该可以被删除,因为它们会使Xcode的CPU使用率过大。 – 2012-01-11 07:32:44

+0

这是什么:uint64 offset = 0; uint32 chunkSize = 8192; – 2014-10-01 08:44:13