Cocoa / Obj-Cの2つ以上のファイルの共通の祖先ディレクトリを取得するにはどうすればよいですか?
-
27-09-2019 - |
質問
NSString
sまたはNSURL
sのいずれかのファイルがたくさんあり(問題ではありません。ほとんどの場合、互換性があります)、共通の祖先ディレクトリを見つける方法が必要です。誰かがこれを行う方法を知っていますか?
解決
どこかにpathByJoiningPathComponents
メソッドがあるか、少なくともそのようなメソッドがあると誓ったかもしれませんが、別のことを考えているに違いありません。これはパスのトリックを行います。10.6を使用している場合はURLでも機能する可能性があります(パスでのみテストしました):
ジェネラコディセタグプレ
残念ながら、それを行うための「組み込み」の方法はないと思います。
共通の祖先を見つけたいファイルパスの配列がある場合は、次のようにすることができます。 ジェネラコディセタグプレ
自動解放プールをクリーンに保ちたい場合、特にパスの配列が大きい場合は、これらのオブジェクトの一部を明示的に割り当てて解放することをお勧めします。
他のヒント
パスをコンポーネントのNSArrayとして表します。(Mac OS X 10.6以降では、各オブジェクトにpathComponents
メッセージを送信します。以前のバージョンおよびiPhone OSでは、NSStringを取得するためにNSURLオブジェクトのpath
メッセージを送信してから、それらのpathComponents
メッセージを送信する必要があります。)>
これまでの共通パスを含むNSMutableArrayを用意します。最初のパスのコンポーネントに初期化します。
後続のパスごとに、NSEnumeratorsを使用して、ロックステップでそのパスと現在のパスの両方を繰り返します。
- これまでの共通パスがなくなっても、変更はありません。
- 調べているパスがなくなった場合、それは新しい共通パスです。
- 等しくないコンポーネントが発生した場合、その前のすべてのコンポーネントが新しい共通パスになります。ここでロックステップの反復を破ります。
終了すると、0個以上のパスコンポーネントの配列が作成されます。これらを絶対パス文字列に結合すると、共通パス文字列が生成されます。
ファイルを取得し、次のファイルを取得し、その祖先を繰り返し処理して(NSStringのpathComponents
メソッドがこれに役立ちます)、共通のファイルが見つかるまで繰り返します。次に、次のファイルに移動して、同じ祖先があるかどうかを確認します。そうでない場合は、共通点が見つかるまで戻ってください。リストの最後に到達するまでこれを繰り返します。