如何通过网络传输大文件/目录使用AsyncSocket
我已经尝试了NSTask> NSData方法,但CPU /内存开销对于超过1GB的任何内容都非常大,所以我需要找到一种方法来执行此操作,比如说,一台FTP服务器就可以做到。如何通过网络传输大文件/目录使用AsyncSocket
编辑:远程桌面的复制文件如何做到这一点?
我想我明白了。我不得不以小字节大小(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];
您也可以修改chunkSize以适应您的内存占用需求。 :D NSLog()应该可以被删除,因为它们会使Xcode的CPU使用率过大。 – 2012-01-11 07:32:44
这是什么:uint64 offset = 0; uint32 chunkSize = 8192; – 2014-10-01 08:44:13
我让别人精心制作的官方答案,但这样我会解决问题这样将有一个最大尺寸(一个缓冲,或'NSData'对象),然后执行按顺序增量传输。 – 2012-01-11 05:20:45
由于我的应用程序是一个客户端服务器应用程序,我可以用单一身份验证编写FTP服务器,并让客户端连接到侧面并下载它? – 2012-01-11 05:57:01
确定...你可以做任何你想要的文件传输(FTP,TCP,UDP,两个锡罐和一个字符串连在一起等)。当你是程序员时,你可以决定如何最好地实现文件传输。 :-) – 2012-01-11 06:00:52