win7(64bit)の悲劇 - 「Current」Directoryってドコ? -
というわけで、まさかの続編。fpritfの書き込み先のお話。
この前書いた通り、win7だとファイル書き込みが不自由になっているんですが、
その対策の弊害(?)で、カレントディレクトリ操作に注意が必要になっているようです。
どういうことかと言うと…
FILE *fp = fopen( "Debug.txt", "wt" ); char now_dir[_MAX_PATH]; GetCurrentDirectory( _MAX_PATH, now_dir ); if( fp != NULL ) { fprintf( "1st line\n" ); // (1) // ここでディレクトリ変更 SetCurrentDirectory( "sub/Debug" ); fprintf( "2nd line\n" ); // (2) // ここで元のディレクトリへ SetCurrentDirectory( now_dir ); fprintf( "3rd line\n" ); // (3) fclose( fp ); }
↑このようなコードの時、(1)(2)(3)はどこに書き出されるか?
という話。
…正解は、
(1) … (exeのフォルダ)/Debug.txt
(2) … (exeのフォルダ)/sub/Debug/Debug.txt
(3) … (exeのフォルダ)/sub/Debug/Debug.txt
(1)(2)は順当ですが、(3)は何故か元に戻りません。
対処法としては、
この辺かと。
・SetCurrentDirectory()後は、「必ず」fpを開きなおす。
・そもそも絶対パス指定にしておく。
レジストリ登録型のものでない場合は、絶対パスは現実味がない気がするので、
開き直しでいくのがいいのかね。