Pentanium Reactor Blog

ゲーム、アニメ、CG、プログラミング

マルチバイトパスが来ちゃった場合に

2007年09月12日 22時32分48秒 | 雑記
Cocoa備忘録。
日本語のフォルダが含まれたパスとか来ちゃった場合に開けなくて困ったりした時。
[NSString stringWithCString:cstr]ではなく[filemanager stringWithFileSystemRepresentation:cstr length:len]でパスのNSStringを作るが良いという話。
#import <stdio.h>
#import <string.h>
#import <Foundation/Foundation.h>

int main(int argc, char *argv[])
{
  NSAutoreleasePool *apool ;
  NSFileManager *fm;
  NSString *cstrString, *sysRepString;
  int i;
  
  apool = [[NSAutoreleasePool alloc] init];
  fm = [NSFileManager defaultManager];
  
  for(i=1;i<argc;i++){
    printf("input C string path = %s\n", argv[i]);
    
    // Bad for multi byte string path
    cstrString = [NSString stringWithCString:argv[i]];
    printf("use NSString's +stringWithCString: => ");
    if( [fm fileExistsAtPath:cstrString] ) printf("file exists!\n");
    else printf("file not exists.\n");
    
    // Good for multi byte string path
    sysRepString = [fm stringWithFileSystemRepresentation:argv[i] length:strlen(argv[i]) ];
    printf("use NSFileManager's -stringWithFileSystemRepresentation:length: => ");
    if( [fm fileExistsAtPath:sysRepString] ) printf("file exists!\n");
    else printf("file not exists.\n");
  }
  
  [apool release];
  
  return 0;
}

というものをpathtest.mとして。
> 
> ls testdir/
ascii_path.txt                          マルチバイトパス.txt
> 
> cc -Wall -o pathtest pathtest.m -framework Foundation
> 
> ./pathtest testdir/*
input C string path = testdir/ascii_path.txt
use NSString's +stringWithCString: => file exists!
use NSFileManager's -stringWithFileSystemRepresentation:length: => file exists!
input C string path = testdir/マルチバイトパス.txt
use NSString's +stringWithCString: => file not exists.
use NSFileManager's -stringWithFileSystemRepresentation:length: => file exists!
> 

するってぇとこうなる。
横着しないでドキュメントは良く読もうという事ですな。

最新の画像もっと見る

コメントを投稿