Как отправить файловую иерархию через сокет - PullRequest
2 голосов
/ 08 августа 2011

Итак, я пишу приложение, которое должно получить файловую структуру через сокет от серверного приложения (которое я также контролирую). Мой клиент находится в target-c, и ему нужно будет создать массив объектов «File». Я подумал, что рекурсия будет хорошим способом для этого, но я знаю, что моя реализация неверна.

Вот мое оригинальное мышление:

Я планировал использовать синтаксис, чтобы сообщить клиенту, есть ли у узла какие-либо дочерние элементы (например, папка) или это был лист (например, файл). Я также подумал о наличии синтаксиса «lastleaf» для последнего листа, чтобы остановить рекурсию. Синтаксис будет "тип: путь / к / файлу". Вот грубый алгоритм, который я придумал:

NSString* string = [self getStringFromSocket];
NSArray* split = [string componentsSeparatedByString:@":"];

if( [@"lastleaf" isEqualToString:[split objectAtIndex:0]] ) {
    MyFile* newFile = [[MyFile alloc] initWithPath:[split subarrayWithRange:NSMakeRange(1, [split count]-1)]];
    return [[NSMutableArray alloc] initWithObjects:newFile, nil];
} else if([@"leaf" isEqualToString:[split objectAtIndex:0]]) {
    MyFile* newFile = [[MyFile alloc] initWithPath:[split subarrayWithRange:NSMakeRange(1, [split count]-1)]];
    NSMutableArray* children = [[NSMutableArray alloc] initWithObjects:newFile, nil];
    [children addObjectsFromArray: [self getFiles]];
    return children;
} else if([@"parent" isEqualToString:[split objectAtIndex:0]]) {
    MyFile* newFile = [[MyFile alloc] initWithPath:[split subarrayWithRange:NSMakeRange(1, [split count]-1)]];
    [newFile setSubfiles: [self getFiles]];
    return [[NSMutableArray alloc] initWithObjects:newFile, nil];
}

}

Я рад за всех, кто игнорирует это и имеет дело с псевдокодом, это было только мое ошибочное мышление о том, чтобы что-то делать.

Буду признателен за любые предложения или помощь.

Редактировать: я хочу видеть только путь к файлам и их структуру, а не содержимое

Ответы [ 3 ]

0 голосов
/ 08 августа 2011

По сути, вы должны использовать существующий класс или библиотеку, которая управляет файловым архивом. Это будет иметь всю логику, необходимую для объединения файловой иерархии и ее распаковки. Проверьте этот вопрос для получения дополнительной информации Класс Какао для архивирования и разархивирования файлов TAR

0 голосов
/ 08 августа 2011

Идеальный способ инкапсулировать структуру файловой системы - это вложенные NSDictionary объекты:

  • Нет шансов на бесконечную рекурсию, поскольку существует конечное число пар ключ-значение
  • Если вы хотите добавить атрибуты к файлам, вы можете использовать синтаксис ключа, например <filename>_attr_readonly или <filename>_isFolder, или вы даже можете предоставить функцию serialize и deserialize для пользовательских File объектов (содержащих атрибуты и т. Д.).далее), которые преобразуют их в NSString s и используют эти строки в качестве соответствующего значения для ключа имени файла
  • . Они могут быть изначально сериализованы в файл Plist, а затем вы отправляете plist клиенту (ссжатие, которое будет работать особенно хорошо из-за содержимого, содержащего только текст)

Чтобы быть немного понятнее:

NSDictionary (path: "/")
|
*-- key "myFile" -> value <MyFile> (path: "/myFile")
|
*-- key "myNestedFolder" -> value <NSDictionary>
                                   |
                                   *-- key "myNestedFile" -> value <MyFile>
                                       (path "/myNestedFolder/myNestedFile")
0 голосов
/ 08 августа 2011

Я бы отправил его в формате ZIP. Заботится обо всей проблеме протокола, а также добавляет сжатие. Все, что вам нужно, это подходящая библиотека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...