NSString
s かs のいずれかのファイルがたくさんありNSURL
(どちらでもかまいません。ほとんどの場合、それらは交換可能です)、共通の祖先ディレクトリを見つける方法が必要です。誰もこれを行う方法を知っていますか?
3 に答える
pathByJoiningPathComponents
どこかに方法があると断言できたし、少なくともそのような方法が 1 つはあったかもしれないが、別のことを考えているに違いない。これはパスのトリックを行います.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 を使用してロックステップでそのパスと現在のパスの両方を繰り返します。
- これまでの共通パスが尽きた場合、変更はありません。
- 調べているパスがなくなると、それが新しい共通パスになります。
- 等しくないコンポーネントが見つかった場合、それより前のすべてのコンポーネントが新しい共通パスになります。ここでロックステップの反復を中断します。
完了すると、0 個以上のパス コンポーネントの配列ができます。これらを絶対パス文字列に結合すると、共通パス文字列が生成されます。
ファイルを取得し、次のファイルを取得し、その祖先を反復処理します (これには NSString のpathComponents
メソッドが役立ちます) 共通のものを見つけるまで。次に、次のファイルに移動し、同じ祖先があるかどうかを確認します。そうでない場合は、共通点が見つかるまで戻ってください。リストの最後に到達するまでこれを繰り返します。