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 版を使っているので、自分でも使わないし問題はない。