2

エラーが発生します:

別のプロセスで使用されているため、プロセスはファイル 'E:\testing\check1.txt' にアクセスできません。

ここに私のコードがあります:

private void timer2_Tick(object sender, EventArgs e)
{
    StreamWriter sw1 = new StreamWriter("E:\\testing\\check1.txt");
    sw1.Flush();
    if (dt[playback_iterator].iden == this.event_id)
    {

        foreach (Type type in asm1.GetTypes())
        {
            if (type.IsSubclassOf(typeof(System.Windows.Forms.Form)))
            {
                System.Windows.Forms.Form f = (System.Windows.Forms.Form)Activator.CreateInstance(type);
                foreach (Control ctrl in f.Controls)
                {
                    if (ctrl.Handle.ToInt32() == dt[playback_iterator].hndl)
                    {
                        if (ctrl.BackColor.R == this.r_comp && ctrl.BackColor.G == this.g_comp && ctrl.BackColor.G == this.g_comp)
                        {
                            sw1.WriteLine("verification point was set and the test passed");
                            /*success ob = new success();
                            ob.Show();*/
                        }
                        else
                        {
                            sw1.WriteLine("verification point test failed");
                        }

                    }
                }

            }
            sw1.Close();

            if (dt[playback_iterator].hndl == -1 && dt[playback_iterator].x == -1 && dt[playback_iterator].y == -1)
            {
                timer2.Enabled = false;
            }
            MoveMouse(dt[playback_iterator].hndl, dt[playback_iterator].x, dt[playback_iterator].y);
            if (dt[playback_iterator].click_detect.Equals("yes"))
            {
                ClickMouse(MonkeyButtons.btcLeft, dt[playback_iterator].x, dt[playback_iterator].y, 0, 0);
            }
            if (dt[playback_iterator].word != "")
            {
                ++count;
                StringBuilder wd = new StringBuilder(dt[playback_iterator].word);
                SetForegroundWindow(dt[playback_iterator].hndl);
                SendKeys.Send(dt[playback_iterator].word);
            }
            playback_iterator++;

        }
    }
}
4

3 に答える 3

0

この条件なら

if (dt[playback_iterator].iden == this.event_id)

が正しくない場合、StreamWriterファイルは確定的に閉じられず、次にファイルを開こうとすると、アクセス違反が発生する可能性があります。

usingステートメントを使用する

using (StreamWriter sw1 = new StreamWriter("E:\\testing\\check1.txt"))
{
}

その後、を削除することもできsw1.Close()、ライターは常に一度だけ閉じられます。

注: エラーは、ファイルが現在のプロセスによって使用されていることを意味する場合もあります。メモ帳はファイルを開いたままにしないと思うので、メモ帳は問題になりません。

于 2012-05-02T06:50:05.583 に答える
0

StreamWriter オブジェクトを閉じないでください。このエラーを追加しようとしている場合は、ループ内で作成するたびに FileStream クラスを使用してログを追加します。

string logFile = "E:\\testing\\check1.txt";
FileStream fs = new FileStream(logFile, FileMode.Append, FileAccess.Write);
StreamWriter sw1 = new StreamWriter(fs);
sw1.Flush();
if (dt[playback_iterator].iden == this.event_id)
{

    foreach (Type type in asm1.GetTypes())
    {
        if (type.IsSubclassOf(typeof(System.Windows.Forms.Form)))
        {
            System.Windows.Forms.Form f = (System.Windows.Forms.Form)Activator.CreateInstance(type);
            foreach (Control ctrl in f.Controls)
            {
                if (ctrl.Handle.ToInt32() == dt[playback_iterator].hndl)
                {
                    if (ctrl.BackColor.R == this.r_comp && ctrl.BackColor.G == this.g_comp && ctrl.BackColor.G == this.g_comp)
                    {
                        sw1.WriteLine("verification point was set and the test passed");
                        /*success ob = new success();
                        ob.Show();*/
                    }
                    else
                    {
                        sw1.WriteLine("verification point test failed");
                    }

                }
            }

        }
        if (dt[playback_iterator].hndl == -1 && dt[playback_iterator].x == -1 && dt[playback_iterator].y == -1)
        {
            timer2.Enabled = false;
        }
        MoveMouse(dt[playback_iterator].hndl, dt[playback_iterator].x, dt[playback_iterator].y);
        if (dt[playback_iterator].click_detect.Equals("yes"))
        {
            ClickMouse(MonkeyButtons.btcLeft, dt[playback_iterator].x, dt[playback_iterator].y, 0, 0);
        }
        if (dt[playback_iterator].word != "")
        {
            ++count;
            StringBuilder wd = new StringBuilder(dt[playback_iterator].word);
            SetForegroundWindow(dt[playback_iterator].hndl);
            SendKeys.Send(dt[playback_iterator].word);
        }
        playback_iterator++;

    }
}
sw1.Close();
fs.Close();

ありがとう

于 2012-05-02T06:53:09.400 に答える
0

ブロックを使用usingしてテキストファイルに書き込むことができます

using (StreamWriter sw1 = new StreamWriter("E:\\testing\\check1.txt"))
{
    if (condition)
    {
        foreach (Type type in asm1.GetTypes())
        {
            if (contition)
            {
                sw1.WriteLine("verification point was set and the test passed");
            }
        }
    }

}

于 2012-05-02T06:53:58.717 に答える