まだローカルディスク上のファイルなどを指定する場合に、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