2012-01-11 73 views
2

我已經嘗試了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

回答

3

我想我明白了。我不得不以小字節大小(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