我有一堆文件,NSString
或NSURL
s(没关系;它们大部分是可互换的),我需要一种方法来查找共同的祖先目录。有谁知道怎么做?
答案 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
方法对此有用),直到找到它们共有的一个。然后移动到下一个文件,看看它是否具有相同的祖先。如果没有,继续往返,直到找到他们确实有共同点。继续重复此操作,直至到达列表末尾。