2012-01-11 18 views
2

NSTask> NSDataメソッドを試しましたが、CPU /メモリのオーバーヘッドが1GBを超えると非常に大きくなるため、たとえば、FTPサーバーがそれを行います。AsyncSocketを使用して大規模なファイルやディレクトリを転送する方法

EDIT:リモートデスクトップのコピーファイルはどうしますか?

+0

私は他の誰かが公式の答えに手の込んだてもらおう、しかし、私はこのような問題を解決する方法は、(バッファ、または 'NSData'オブジェクトの)最大サイズを持っているだろうし、次にやります連続的な増分での転送。 –

+0

私のアプリはクライアントサーバーアプリケーションなので、単一認証でFTPサーバーを作成し、クライアント側でそのサーバーに接続してダウンロードできますか? –

+0

さて、あなたはどんな種類のファイル転送(FTP、TCP、UDP、2つのスズキが文字列などで結ばれているか)を行うことができます。プログラマとして、ファイル転送をどのように実装するのが最適かを判断します。 :-) –

答えて

3

私はそれを持っていると思います。小さなバイトサイズのメモリ(HAHAは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使用量が過剰であるため、削除する必要があります。 –

+0

これは何ですか:uint64 offset = 0; uint32 chunkSize = 8192; –

関連する問題