職場では、Windows XP から Windows Vista に移行しました。移行後、nUnit を使用した単体テストの一部がランダムに失敗し始め、System.UnauthorizedAccessException がスローされました。失敗した各テストには、テスト DLL に埋め込みリソースとして保存されているテストに使用されるファイルを現在のディレクトリに書き込み、テストを実行してから、通常はセットアップ/ティアダウンまたはフィクスチャ セットアップ/ティアダウンで、立て続けにそれらを削除することが含まれます。これは、テストが実行元の各開発者のドライブ上の場所に依存せず、相対ファイル パスを気にしないようにするためです。
これをトラブルシューティングしているときに、ファイルの作成と削除に関連していることがわかりました。削除時には、各削除は次のパターンに従います。
if( File.Exists(path) ) { File.Delete(path) }
これを try-catch ブロックと catch のブレークポイントで囲むと (例外がスローされた場合)、ファイルはディスクから既に削除されます。通常、XmlWriter または StreamWriter を使用したファイル作成の失敗については、ファイルが存在する場合は上書きするように指定されています。
奇妙なことに、調査中に、例外を再現しているように見える次の C# プログラムを作成しました。
class Program
{
static void Main(string[] args)
{
int i = 0;
try
{
while (true)
{
System.IO.TextWriter writer = new System.IO.StreamWriter("file.txt");
i++;
System.Console.Out.WriteLine(i);
writer.Write(i);
writer.Close();
System.IO.File.Delete("file.txt");
}
}
catch (System.UnauthorizedAccessException ex)
{
System.Console.Out.WriteLine("Boom at: " + i.ToString());
}
}
}
まだ XP がインストールされているマシンの 1 つで、それを強制終了するまで例外なく何十万回も反復し続けます。どの Vista マシンでも、150 ~ 500 回の繰り返しで「Boom」が出力されます。
私は仕事以外で Vista マシンにアクセスできないので、この特定の「癖」が私の雇用主の Vista のセキュリティ構成によるものなのか、Vista 自体によるものなのか判断できません。
言うまでもなく、私はかなり困惑しています。
編集:
皆さんの反応に感謝したいと思います。Christian が提案した Process Monitor を使用したところ、Martin が提案したように、コードの実行中に Windows Vista SearchIndexer と TortoiseSVN の TSVNCache プロセスがターゲット ファイルにアクセスしようとしていることがわかりました。
再度、感謝します。