うっかりしてました。
.NET Frameworkのクラスライブラリで予想外の動作に遭遇したので書いておきます。
Win32 APIのCreateDirectoryなどを使って深いディレクトリを作成する場合、新しく作成される階層の数だけ、APIを呼び出す必要がありました。
たとえば、ディレクトリc:\aが存在しない状況で、以下のようなプログラム(Visual C++による)を実行するとAPIは失敗し、ディレクトリは作成されません。
(各種宣言等は省略)
int _tmain(int argc, _TCHAR* argv[])
{
BOOL result = CreateDirectory("c:\\a\\b\\c",NULL);
printf( "result=%d", (int)result );
return result;
}
これを実行すると以下のような結果になります。
ところが、C#で以下のようなプログラムを書いて実行すると同じ結果になりません。
(各種宣言等は省略)
[STAThread]
static void Main(string[] args)
{
Directory.CreateDirectory("c:\\a\\b\\c");
}
例外は発生せずに実行は終了し、なんと、ディレクトリc:\a\b\cが作成されているのです。
実際にリファレンスからCreateDirectoryメソッドを引いてみると、以下のように書いてあります。
path で指定したすべてのディレクトリとサブディレクトリを作成します。
とてもさりげないですが、「すべての」という部分が、上記のような動作を行う仕様であることを示しているようですね。
思い通りにディレクトリを作成できていたので、ついうっかり、仕様を正しく確認しないで使っていました。おかげで、無駄なコードが入っているプログラムがあります。深いディレクトリを作成する際に、親ディレクトリを作成するようなコードです。
何事も確認せずに正しいことは分からない、という教訓として受け止めておきましょう。
で、困った…… §
ディレクトリが作成できないテストケースを、親ディレクトリがない条件でテストしようと思ったらできなかったので、というかディレクトリができてしまたので気付きました。ですが、結局、そのテストケースは実行不可能なので困った困った……。