如何通过套接字发送文件层次结构

时间:2011-08-08 01:36:10

标签: objective-c file sockets recursion

所以我正在编写一个应用程序,它需要从服务器应用程序(我也可以控制)通过套接字接收文件结构。我的客户端在objective-c中,需要构造一个“File”对象数组。我认为递归是一个很好的方法,但我知道我的实现是不正确的。

这是我最初的想法:

我打算使用语法告诉客户端节点是否有任何子节点(例如文件夹)或者它是一个叶子(例如文件)。我还想到了最后一个叶子的“lastleaf”语法来停止递归。语法为“type:path / to / file”。这是我提出的粗略算法:

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 :(得分:0)

我会以ZIP格式发送。处理整个协议问题并添加压缩。您只需要一个合适的图书馆。

答案 1 :(得分:0)

基本上,您应该利用操作文件存档的现有类或库。这将具有捆绑文件层次结构和解压缩所需的所有逻辑。请查看此问题以获取更多信息Cocoa class for TAR archiving and unarchiving files

答案 2 :(得分:0)

封装文件系统结构的一种完美方法是使用嵌套的NSDictionary对象:

  • 没有无限递归的可能性,因为有一定数量的键值对
  • 如果要为文件添加属性,可以使用<filename>_attr_readonly<filename>_isFolder等关键语法,或者甚至可以提供serializedeserialize功能自定义File对象(包含属性等)将它们转换为NSString s,并将这些字符串用作文件名密钥的对应值
  • 这些可以原生序列化为Plist文件,然后将plist发送到客户端(通过压缩,由于内容仅为文本,因此可以更好地工作)

稍微清楚一点:

NSDictionary (path: "/")
|
*-- key "myFile" -> value <MyFile> (path: "/myFile")
|
*-- key "myNestedFolder" -> value <NSDictionary>
                                   |
                                   *-- key "myNestedFile" -> value <MyFile>
                                       (path "/myNestedFolder/myNestedFile")