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を開きなおす。
・そもそも絶対パス指定にしておく。
この辺かと。

レジストリ登録型のものでない場合は、絶対パスは現実味がない気がするので、

開き直しでいくのがいいのかね。