1

以下に示す関数を呼び出す単純な C# コンソール プログラムがあります。

static void DirTest()
{
    string dir = "Temp";
    for (int i = 0; i < int.MaxValue; i++)
    {
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }
        string file = Path.Combine(dir, "sample.txt");
        File.Create(file).Close();
        File.Delete(file);
        Directory.Delete(dir);
    }
}

一部の Win 7 マシンでは、この関数は最終的に例外をスローします (i が 100,000 を超える場合)。

        未処理の例外: System.UnauthorizedAccessException: パス 'D:\...\Temp\sample.txt' へのアクセスが拒否されました。
       System.IO.__Error.WinIOError (Int32 errorCode、文字列の多分フルパス) で
       System.IO.FileStream.Init (文字列パス、FileMode モード、FileAccess アクセス、Int32 権限、
     ブール値の useRights、FileShare 共有、Int32 bufferSize、FileOptions オプション、SECURITY_ATTRIBU
    TES secAttrs、文字列 msgPath、ブール値 bFromProxy)
       System.IO.FileStream..ctor (文字列パス、FileMode モード、FileAccess アクセス、FileShare sh
    は、Int32 bufferSize、FileOptions オプション)
       System.IO.File.Create (文字列パス) で
       D:\Exceptions\Program.cs:line 118 の Exceptions.Program.DirTest() で
       D:\Exceptions\Program.cs の Exceptions.Program.Main(String[] args):
    167行目

これらのマシンには、McAfee エージェントと Cisco セキュリティ エージェント、およびその他のソフトウェアのホストがインストールされています。Windows Defender が無効になっています。プログラムは管理者コンソールで実行されています。プログラムは .net 3.5 用にコンパイルされています。これは、W2k3 または XP マシンでは見られませんでした。

procmon を使用して、"Temp\sample.txt" が作成および削除されたフォルダーにアクセスしているすべてのイベントとプロセスを監視すると、test-application を除いて他のプロセスがパスにアクセスしていないことがわかります。例外の後でも、procmon にリストされている他のプロセスはありません。したがって、それがウイルス対策のせいだと証明することはできません。

誰が何が間違っているのか考えていますか? Win7 の .net でバグを見つけましたか ;)

ありがとう!

4

2 に答える 2

1

@whywhywhy

コードを少し変更して、もう少し情報が得られるかどうかを確認しました。

static void DirTest()
{
    string dir = "Temp";
    int i = 0;
    try
    {
        for (i = 0; i < int.MaxValue; i++)
        {
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            string file = Path.Combine(dir, "sample.txt");
            File.Create(file).Close();
            File.Delete(file);
            Directory.Delete(dir);
            System.Console.WriteLine("Finished i: " + i);
        }
    }
    catch
    {
        System.Console.WriteLine("Error on i: " + i);
        throw;
    }
}

私は問題なく200,000回の反復を行いました。ループ内の書き込み行をコメントアウトすることもできます。これにより、パフォーマンスが向上しますが、問題は発生しません。

使用しているVisualStudioのバージョンがわかりませんが、いくつか試してみることをお勧めします。1)VSとWindowsの更新を確認します。2)ハードドライブのドライバーの更新を確認します。

おそらく、printステートメントを使用して変更されたコードを実行することもできます...それがタイミングの問題であるかどうかを確認します。printステートメントは、物事をスムーズに実行するのに十分な場合があります。もしそうなら、私の推測は衙門と同じでしょう。

于 2012-05-18T23:18:20.030 に答える
1

コードは私のMaschine Windows 7 / 64 Bitで動作します

あなたの「ウイルス対策」プログラムは、作成されたすべてのファイルをチェックする問題だと思います。

McAffee は実行していますが、Cisco は実行していません。

この答えが役に立てば幸いです;)

于 2012-04-12T08:36:38.457 に答える