【问题标题】:Getting an error 'The process cannot access the file because it is being used by another process.'出现错误“该进程无法访问该文件,因为它正被另一个进程使用。”
【发布时间】:2012-05-02 06:37:19
【问题描述】:

我收到一个错误:

进程无法访问文件“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++;

        }
    }
}

【问题讨论】:

  • 错误说明了您需要知道的内容。它已被另一个进程使用。您可能会在记事本或其他任何窗口中打开它,或者其他应用程序已经在使用该文件,就像您尝试的那样。
  • 不知道,但似乎您正在 foreach() 循环中关闭 File 处理程序,这意味着在第二次迭代等时,任何写入尝试显然都会失败.

标签: c# automation


【解决方案1】:

您可以使用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");
            }
        }
    }

}

【讨论】:

    【解决方案2】:

    不要关闭 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();
    

    谢谢

    【讨论】:

      【解决方案3】:

      如果这种情况

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

      不正确,StreamWriter 未确定性关闭,下次您尝试打开文件时可能会遇到访问冲突。

      使用using 语句

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

      那么您也可以删除sw1.Close(),并且编写器始终只关闭一次。

      注意:错误也可能意味着文件被当前进程使用。我认为记事本不会使文件保持打开状态,因此记事本不会有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多