2012年08月08日

NSStringでパス文字列を比較する場合

前回はNSURLについて書いたが、今回も同じようなパス名の話。

まだローカルディスク上のファイルなどを指定する場合に、NSURLで記述していなくてNSStringを使っている場合も多い。

あるフォルダと同じフォルダを指定した場合には処理をスキップするようなコードを書いたのだが、その時にはまったこと。

文字列が一致するかどうかの比較をする場合には -isEqualToString: または compare: を使うが、パス文字列の場合には注意しないといけないことがある。

例えば、「/Users/eien/Documents」というフォルダは最後に/がある「/Users/eien/Documents/」も同じパスとして認識してほしいのだが文字列としては一致していない。

このため、パス名として表記を統一するためのメソッドがあってそれが -stringByStandardizingPath だ。これで正規化した文字列同士で先のメソッドを使って比較すればいいことになる。

もちろんディレクトリに限らずファイルであっても同じ。またパス文字列は「/Users/eien/tmp/../Documents」や「/Users/eien/Documents/.」なども同じフォルダを指すことになりこれも同じパスとして比較できるようにもなる。


#import <Foundation/Foundation.h>

int main(int argc,char *argv[]){
id ap = [[NSAutoreleasePool alloc] init];
NSString *path1 = @"/Users/eien/tmp";
NSString *path2 = @"/Users/eien/tmp/";
if ( [path1 compare:path2] == NSOrderedSame ) {
NSLog(@"Same!, %@ == %@",path1,path2);
} else {
NSLog(@"differnt, %@ != %@",path1,path2);
}
path1 = [path1 stringByStandardizingPath];
path2 = [path2 stringByStandardizingPath];
if ( [path1 compare:path2] == NSOrderedSame ) {
NSLog(@"Same!, %@ == %@",path1,path2);
} else {
NSLog(@"differnt, %@ != %@",path1,path2);
}
[ap drain];

return 0;
}


ここではcompareを使っているが、 -isEqualToString:でももちろんよい。
ラベル:NSString
posted by 永遠製作所 at 01:23| 東京 ☁| Comment(0) | TrackBack(0) | Cocoa | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック