1

我有一堆文件,要么是NSStrings要么是NSURLs(没关系;它们在大多数情况下是可互换的),我需要一种方法来找到共同的祖先目录。有谁知道如何做到这一点?

4

3 回答 3

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

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

于 2010-05-17T00:42:34.660 回答
2

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

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

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

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

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

于 2010-05-17T00:11:14.370 回答
1

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

于 2010-05-17T00:09:02.383 回答