如何在Cocoa / Obj-C中获取两个或多个文件的公共祖先目录?

时间:2010-05-16 23:52:06

标签: objective-c cocoa directory ancestor

我有一堆文件,NSStringNSURL s(没关系;它们大部分是可互换的),我需要一种方法来查找共同的祖先目录。有谁知道怎么做?

3 个答案:

答案 0 :(得分:4)

我本可以发誓在某个地方有一个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

如果要保持自动释放池的清洁,可能需要显式分配和释放其中一些对象,尤其是在路径较大的情况下。

答案 1 :(得分:2)

将路径表示为NSArrays组件。 (在Mac OS X 10.6及更高版本中,向每个对象发送pathComponents消息;在早期版本和iPhone OS上,您需要发送NSURL对象path消息以获取NSStrings,然后发送这些消息pathComponents消息。)

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

对于每个后续路径,使用NSEnumerators以锁步方式迭代该路径和当前路径。

  • 如果到目前为止的公共路径已用完,则无法更改。
  • 如果您正在检查的路径用完,则它是新的公共路径。
  • 如果遇到不等的组件,则它之前的所有组件都是新的公共路径。在这里打破锁步迭代。

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

答案 2 :(得分:1)

获取一个文件,获取下一个文件,遍历其祖先(NSString的pathComponents方法对此有用),直到找到它们共有的一个。然后移动到下一个文件,看看它是否具有相同的祖先。如果没有,继续往返,直到找到他们确实有共同点。继续重复此操作,直至到达列表末尾。