なんでエラー?って思ったらMayaLTじゃfopenが使えなかった!
まさかこんなところに制約があるとは思わず、しばらく悩んでた;
(理由はわからなくもないけど、
エラーでMayaLTでは使えませんくらい出してくれても><)
と、いうわけで代わりのコマンドfreadAllTextとfwriteAllTextを使ってみた。
とはいえ、使い方はとてもシンプルで分かりやすい。
ファイルに書き込む場合の関数
fwriteAllText(“ファイルパス”,”描き込むテキスト”);
fwriteAllLines(“ファイルパス”,”描き込む配列”);
ファイルから読み込む場合の関数
freadAllText(“ファイルパス”);
freadAllLines(“ファイルパス”);
Lineの方は配列を一行として、読み書きしてくれる。
これかかなり便利なので私はこっちのほうが多用してる。
実際に使ってみる
ソース(プロジェクトフォルダにあるtest.txtを読み込む)
string $aProjectDirectoryPath = `workspace -q -rd`; string $aTextList[] = freadAllLines( $aProjectDirectoryPath + "test.txt" );
1行目
`workspace -q -rd`で現在のプロジェクトのパスを取得できるのでしてます。
2行目
先ほど取得したプロジェクトのパスに、ファイル名を足してfreadAllLinesに渡してます。
Linesなので戻り値が配列になっています。ファイルの中身が$aTextList[]に入ります。
おまけ:ファイルがなかった場合の対処
ファイルがない時のエラーに違和感が・・・
指定したファイルがなかった時に何らかの対処をしないといけないと思うのですが、なんとなくエラーがわかりにくい;
// 警告: line 655: fopen: ファイル “D:/test.txt” をモード “r” に開くことはできません。
要するにファイルがなくて開けなかったという状態なのですが、そうは見えない;
fopenじゃないし、使えないfopenを使おうとした時もこのエラーだったし・・・;
なのでちゃんとエラー処理をしてみた。
ソース
global proc loadFile(){ string $aProjectDirectoryPath = `workspace -q -rd`; if( `filetest -f ( $aProjectDirectoryPath + "test.txt" )` == false ){ error "ファイルが存在しません"; return; } string $aTextList[] = freadAllLines( $aProjectDirectoryPath + "test.txt" ); }
filetestはファイルの有無を調べるときに利用できます。
`filetest -f ( “ファイルパス” )`
フラグに関しては・・・
「-f ファイルが存在し、通常ファイルの場合は true です。」
となっていますので、戻り値がfalseだった場合ファイルが存在しないことになるので、エラーメッセージを出します。
大抵関数の頭でチェックしてファイルがなかったらreturnで出て行っちゃうやり方をしています。
それにしてもMayaのエラーメッセージってところどころ内容と一致していないような気が・・・;