sci

最果て風呂

CocoaMto にファイル入出力を実装

メニューバーを利用してファイルの入出力

この記事の続き。

Cocoa 版にメニューバーからのファイル読み込み・保存機能を付けた。情報が少なくてかなり時間がかかった。

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
NSArray *allowedFileTypes =
 [NSArray arrayWithObjects:@"txt",@"'TEXT'",nil];
[openPanel setAllowedFileTypes:allowedFileTypes];
NSInteger pressedButton = [openPanel runModal];

ここまでは常套句になっているみたい。で、パスを取得する部分なのだが、どうも最近は URL 形式でパスを取得するみたいなんだよね。

NSURL *filePath = [openPanel URL];
NSString *text =
 [NSString stringWithContentsOfFile:[filePath absoluteString]
                           encoding:NSUTF8StringEncoding
                              error:nil];
_inputTextArea.string = text;

NSLog(@"選択したファイルは '%@' ですか?", filePath);

得られるのは file:///Users/hoge/fuga.txt って形。ビルドも出来るしエラーも出ないのだけど、実際はファイルの読み込みも書き込みも出来ていない。パスの部分に /Users/hoge/fuga.txt を直接指定しておくと、(ダイアログでどのようなファイル名を指定しても)ちゃんと fuga.txt が出力される(し読み込まれる)。

file:///... 形式はブラウザで良く使われるし、シェルからの指定でもちゃんとアクセスできるのだけれど、Cocoa からだとダメみたい。そこで substringFromIndex を使って頭から file:// を削除してやると動くようになった。

[NSString stringWithContentsOfFile:
 [[filePath absoluteString] substringFromIndex:7]
                          encoding:NSUTF8StringEncoding
                             error:nil];

しかしこれ、http:// だった場合とか動かないし、もっとちゃんとするにはどうすればいいのだろう?情報が iOS 系ばかりで、あったとしても古くて obsolete になってたり……つらい。

まぁ今はブラウザで JS 版を使っているので、自分でも使わないし問題はない。