我有一堆文件,要么是NSString
s要么是NSURL
s(没关系;它们在大多数情况下是可互换的),我需要一种方法来找到共同的祖先目录。有谁知道如何做到这一点?
3 回答
我可以发誓在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
如果您想保持自动释放池干净,您可能需要显式分配和释放其中一些对象,尤其是在您有大量路径的情况下。
将路径表示为组件的 NSArray。(在 Mac OS X 10.6 及更高版本中,向每个对象发送一条pathComponents
消息;在早期版本和 iPhone OS 中,您需要发送 NSURL 对象path
消息以获取 NSString,然后发送这些pathComponents
消息。)
到目前为止,有一个包含公共路径的 NSMutableArray。将其初始化为第一个路径的组件。
对于每个后续路径,使用 NSEnumerators 以同步方式迭代该路径和当前路径。
- 如果到目前为止的共同路径用完,则没有变化。
- 如果您正在检查的路径用完,则它是新的公共路径。
- 如果遇到不相等的组件,它之前的所有组件都是新的公共路径。在这里打破锁步迭代。
完成后,您将拥有一个由零个或多个路径组件组成的数组。将这些加入绝对路径字符串将生成公共路径字符串。
获取一个文件,获取下一个文件,遍历其祖先(NSString 的pathComponents
方法将对此很有用),直到找到它们的共同点。然后移动到下一个文件,看看它是否具有相同的祖先。如果没有,请继续返回,直到找到他们确实有共同点的那个。不断重复此操作,直到到达列表末尾。