Как передать большие файлы / каталоги по сети, используя AsyncSocket - PullRequest
2 голосов
/ 11 января 2012

Я испробовал метод NSTask> NSData, но загрузка ЦП / памяти чрезвычайно велика для всего, что превышает 1 ГБ, поэтому мне нужно найти способ сделать это, например, на FTP-сервере.

РЕДАКТИРОВАТЬ: Как это делают файлы копирования на удаленном рабочем столе?

1 Ответ

3 голосов
/ 11 января 2012

Я думаю, что понял.Я должен был прочитать это в память маленькими кусочками (HAHA GET THE PUN?) И перенести это таким образом.Имейте в виду, что это работает только для файлов, а не для каталогов.Я протестировал его на 450 МБ файле, и он скопировал примерно за 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];
...