1

次の C# コードは、「File.WriteAllText("test_a.cmd", "timeout 15")」行で失敗することがあります。理由と解決方法を知っている人はいますか? ありがとう。

        for (int i = 0; i < 100; i++)
        {
            File.WriteAllText("test_a.cmd", "rem timeout 1");
            var p = Process.Start("test_a.cmd");

            p.WaitForExit();
            p.Dispose();
            p = null;

            //GC.Collect();
            //GC.WaitForPendingFinalizers();

            File.Delete("test_a.cmd");

            // Somtetimes it causes System.UnauthorizedAccessException: Access to the path 'XXX\test_a.cmd' is denied.
            File.WriteAllText("test_a.cmd", "timeout 15");
        }
4

2 に答える 2

2

削除共有でファイルを開いた別のプロセスがあります。これにより、 File.Delete() 呼び出しが成功します。ただし、後続の File.WriteAllText() ではありません。ファイルを削除した後もファイルが存在するためです。他のプロセスがファイルのハンドルを閉じるまで、それは消えません。このように未解決のままファイルを上書きしようとすると、「アクセスが拒否されました」というエラーで失敗します。

これは、操作するファイルに他のプロセスが関心を持つ可能性があるマルチタスク オペレーティング システムでプログラムを実行する際の気まぐれです。ほとんどの Windows インストールでは、このようなプロセスの候補が常に存在します。ウイルス対策プログラムを無効にして、問題が解決するかどうかを確認してください。

しばらく寝てからやり直すだけでなく、損失を最小限に抑える適切な方法があります。ファイルの名前を変更できます。この例外でヒットする可能性ははるかに低くなります。

File.Delete("test_a.cmd.bak");
File.Move("test_a.cmd", "test_a.cmd.bak");
for (int attempt = 0; ; ++attempt) {
    try {
       File.WriteAllText("test_a.cmd", "timeout 15");
       break;
    }
    catch (System.UnauthorizedAccessException ex) {
       if (attempt > 10) throw;
       System.Threading.Thread.Sleep(1000);
    }
}
try {
    File.Delete("test_a.cmd.bak");
}
catch (Exception ex) {}
于 2013-10-21T09:56:43.000 に答える
0

File.WriteAllText() はファイルを作成/上書きするため、Delete の呼び出しは必要ありません。実際、それがおそらく問題の原因です。

だから、私の解決策は次のとおりです。

  • リモート ファイル.削除
  • 最後の WriteAllText の前に Thread.Sleep(100) を追加します

スリープ部分は、Windows が処理を実行できるようにすることであり、それが基本的に例外の原因です。

于 2013-10-21T08:30:25.200 に答える