0

我知道这里有一个简单的解决方案,但我不能完全理解它。我有一个用户生成的 .plist 文件,其中可以包含(合理的)无限数量的嵌套树。我想要做的是根据 plist 的嵌套方式创建一个文件夹结构。

.plist 示例

由于我不知道主字典有多深,我无法弄清楚如何循环遍历它并告诉它创建一个目录,然后潜入该目录并在其中创建目录。

我知道如何创建文件夹,它遍历整个列表是让我失望的。我很确定我需要一个单独的递归方法,只是不确定从哪里开始。键“儿童”和“名称”是我用来创建列表的。任何帮助都会很棒。

4

2 回答 2

1

我将首先定义要在其中创建目录结构的目录的路径。然后调用该函数来构建目录结构。

NSString *pathToDirectory = @"./";
[self buildDirectoriesAtPath: pathToDirectory fromDictionary: dictionary];

该函数-buildDirectoriesAtPath:fromDictionary:是递归的,看起来像这样:

- (void) buildDirectoriesAtPath: (NSString *) filepath fromDictionary: (NSDictionary *) dictionary {

    for (NSString *key in dictionary.allKeys) {

        if ([key isEqualToString: @"Children"]) {

            NSArray *children = [dictionary objectForKey: key];
            for (id object in children) {

                if ([object isKindOfClass: [NSDictionary class]]) {
                    NSDictionary *directoryInfo = (NSDictionary *) object;
                    NSString *directoryName = [directoryInfo objectForKey: @"Name"];
                    NSString *directoryPath = [NSString stringWithFormat: @"%@%@", filepath, directoryName];

                    //  Create directory
                    NSLog(@"Creating directory: %@", directoryPath);

                    //  Create subdirectories
                    NSArray *subdirectories = [directoryInfo objectForKey: @"Children"];
                    for (id directory in subdirectories) {

                        if ([directory isKindOfClass: [NSString class]]) {
                            NSString *subdirectoryName = (NSString *) directory;
                            NSString *subdirectoryPath = [NSString stringWithFormat: @"%@/%@", directoryPath, subdirectoryName];

                            //  Create directory
                            NSLog(@"Creating directory: %@", subdirectoryPath);
                        }
                        else if ([directory isKindOfClass: [NSDictionary class]]) {
                            NSDictionary *subdirectory = (NSDictionary *) directory;
                            NSString *subdirectoryName = [subdirectory objectForKey: @"Name"];
                            NSString *subdirectoryPath = [NSString stringWithFormat: @"%@/%@/", directoryPath, subdirectoryName];

                            [self buildDirectoriesAtPath: subdirectoryPath fromDictionary: (NSDictionary *) directory];
                        }
                    }
                }
                else if ([object isKindOfClass: [NSString class]]) {
                    NSString *directoryName = (NSString *) object;
                    NSString *directoryPath = [NSString stringWithFormat: @"%@%@", filepath, directoryName];

                    //  Create directory
                    NSLog(@"Creating directory: %@", directoryPath);
                }
            }
        }
    }
}

如果您有什么想澄清的,请不要犹豫。:)

于 2013-04-11T04:39:09.503 回答
1

可能这个功能会帮助你,

void recursiveCall (NSDictionary *dictionary) {
    NSArray *_keys = [dictionary allKeys];
    for (NSString *_key in _keys) {
        id obj = [dictionary valueForKey:_key];
        NSLog(@"Create folder of %@",_key);
        if ([obj isKindOfClass:[NSArray class]]) {
            for (id _obj in obj) {
                if ([_obj isKindOfClass:[NSDictionary class]]) {
                    recursiveCall(_obj);
                }
                else {
                    NSLog(@"Create folder of %@",_obj);
                }
            }
        }

    }
}
于 2013-04-11T04:39:26.427 回答