代码之家  ›  专栏  ›  技术社区  ›  Alexsander Akers

如何获取coco/obj-c中两个或多个文件的共同祖先目录?

  •  1
  • Alexsander Akers  · 技术社区  · 16 年前

    我也有很多文件 NSString S或 NSURL S(这并不重要,它们在很大程度上是可互换的),我需要一种方法来找到共同的祖先目录。有人知道怎么做吗?

    3 回复  |  直到 11 年前
        1
  •  4
  •   dreamlax    16 年前

    我可以发誓 pathByJoiningPathComponents 方法在某个地方,或者至少有一个类似的地方,但我一定在想别的东西。这对路径有好处,如果您在10.6上(我只用路径测试过它),它也可能对URL有效:

    NSString *path1 = @"/path/to/file1.txt";
    NSString *path2 = @"/path/to/file/number2.txt";
    
    NSArray *path1Comps = [path1 pathComponents];
    NSArray *path2Comps = [path2 pathComponents];
    
    NSUInteger total = [path1Comps count];
    if ([path2Comps count] < total)
        total = [path2Comps count];  // get the smaller of the two
    
    NSUInteger i;
    for (i = 0; i < total; i++)
        if (![[path1Comps objectAtIndex:i] isEqualToString:[path2Comps objectAtIndex:i]])
            break;
    
    NSArray *commonComps = [path1Comps subarrayWithRange:NSMakeRange(0, i)];
    
    // join commonComps together to get the common path as a string
    

    不幸的是,我不认为有一种“内置”的方法可以做到这一点。

    如果您有一个文件路径数组,想要找到共同的祖先,可以这样做:

    NSArray *allPaths = [NSArray arrayWithObjects:@"/path/to/1.txt", @"/path/to/number/2.txt", @"/path/to/number/3/file.txt", nil];
    
    // put some checks here to make sure there are enough paths in the array.
    
    NSArray *currentCommonComps = [[allPaths objectAtIndex:0] pathComponents];
    
    for (NSUInteger i = 1; i < [allPaths count]; i++)
    {
        NSArray *thisPathComps = [[allPaths objectAtIndex:i] pathComponents];
        NSUInteger total = [currentCommonComps count];
        if ([thisPathComps count] < total)
            total = [thisPathComps count];
    
        NSUInteger j;
        for (j = 0; j < total; j++)
            if (![[currentCommonComps objectAtIndex:j] isEqualToString:[thisPathComps objectAtIndex:j]])
                break;
    
        if (j < [currentCommonComps count])
            currentCommonComps = [currentCommonComps subarrayWithRange:NSMakeRange(0, j)];
    
        if ([currentCommonComps count] == 0)
            break; // no point going on
    }
    
    // join currentCommonComps together
    

    如果您想保持自动释放池的干净,特别是在您有大量路径的情况下,您可能需要显式地分配和释放其中一些对象。

        2
  •  2
  •   Peter Hosey    16 年前

    将路径表示为组件数组。(在Mac OS X 10.6及更高版本中,发送每个对象 pathComponents 消息:在早期版本和iPhone操作系统中,您需要发送nsurl对象 path 获取nsstrings的消息,然后发送 致病成分 消息)

    有一个包含到目前为止的公共路径的nsmutablearray。将其初始化为第一个路径的组件。

    对于每个后续路径,使用nsEnumerators在lockstep中迭代该路径和当前路径。

    • 如果到目前为止的公共路径用完了,就没有变化。
    • 如果您正在检查的路径用完了,它就是新的公共路径。
    • 如果遇到不相等的组件,则之前的所有组件都是新的公共路径。在这里中断锁步迭代。

    完成后,您将拥有一个由零个或多个路径组件组成的数组。将这些连接到一个绝对路径字符串将产生一个公共路径字符串。

        3
  •  1
  •   Chuck    16 年前

    获取一个文件,获取下一个文件,遍历其祖先(nsstring的 pathComponents 方法将非常有用),直到您找到它们的共同点。然后移到下一个文件,查看它是否具有相同的祖先。如果没有,继续回去直到你找到他们的共同点。一直重复这个直到你到达列表的末尾。