关闭StreamWriter后解析正在使用的异常文件

时间:2011-05-02 20:42:02

标签: c# exception streamwriter file-in-use

我收到错误:

The process cannot access the file 
'C:\AMR_VOYANT_TESTING\PWM_TESTER\UUT_LOGS\TEST_LOG_PWM_10245_UUT_SN_10.TXT'
because it is being used by another process.

我的程序刷新,关闭并处置日志文件。我的程序稍后尝试打开文件以附加更多数据。第二次打开导致上述异常。

Process Explorer在执行期间不会显示文件的句柄,无论是直接访问二进制文件还是使用MS Visual C#Express 2008以调试模式运行。

没有其他进程应该使用此文件,因为它是我的应用程序创建的原始文件。

Stack Overflow中的一些解决方案建议实现using语句,但这是不可行的,因为数据的写入不会发生在简单或简短的复合语句中。日志记录类使用writer委托将数据写入文件。

根据Stack Overflow中的其他解决方案,在for循环中,文件在打开文件的下一次迭代之前可能无法关闭。我再次打开文件之前等了10多秒,无济于事(同样的例外)。

以下是代码示例:

    public void
    close()
    {
        get_log_file().WriteLine("");
        get_log_file().Flush();
        get_log_file().Close();
        get_log_file().Dispose();
        m_log_file = null;
        return;
    }


    private StreamWriter
    get_log_file()
    {
        if (m_log_file == null)
        {
            bool successful = false;
            int retries_remaining = 5;
//                do
//                {
//                    try
//                    {            
//                        m_log_file = new StreamWriter(m_filename, true);
                m_log_file = new StreamWriter(new FileStream(m_filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
//                    }
//                    catch (IOException)
//                    {

//                        --retries_remaining;
//                        System.Threading.Thread.Sleep(250); // Units are in milliseconds;
//                    }
//                } while (!successful && (retries_remaining >= 0));
            }
            return m_log_file;
        }
        private System.IO.StreamWriter m_log_file = null;
        private string m_filename;

由于我有截止日期,我正在寻找解决这个问题的方法。我的一些想法是:

  1. 保持文件打开;不要打开和关闭 在试运行期间。
  2. 显示“等待文件”消息 轮询文件时的用户(到 看什么时候可以再次打开)
  3. 编写非托管C或C ++ 库来处理文件I / O. (因为非托管C和C ++不使用 .NET框架)。
  4. 学习如何告诉.NET 框架快点关闭 文件。
  5. 我在Windows 7,64位架构上使用MS Visual C#2008 Express。

4 个答案:

答案 0 :(得分:0)

  1. 如果你想做得对,你必须花一些时间。或
  2. 使用tracinglogging框架。
  3. 我猜您正在使用Visual Studio Hosting Process进行调试。尝试禁用它并检查文件锁定问题是否消失。
  4. 禁用

    复选框
    Project - Properties - Debug - x Enable Visual Studio hosting process
    

    也可能是您在应用程序关闭期间在StreaWriter已关闭的情况下在一个终结器中进行跟踪。你可以使用Critical Finalizer

    解决这个问题

    此致,   Alois Kraus

答案 1 :(得分:0)

我希望为您提供快速解决方案,将FileMode.OpenorCreate替换为FileMode.Append;

正如其他人指出的那样,有许多其他日志记录选项,但我相信这可能会为您提供一个快速前进的方向,而不是向后退步以获得前锋。

在我看来,你的代码是一个类的片段,它将streamwriter返回给调用上下文。我会让你的类实现IDisposable改变你的接近Dispose(以实现IDIposable),然后让你的消费者将调用包装成一个using(yourLogClass logger = new yourLogClass())...等,以确保关闭被调用每次使用。

答案 2 :(得分:0)

调用open方法后,调用此类中方法的代码不会调用close()方法。根据您发布的代码,我假设有一个单独的open方法。如果多次调用该方法,那么您将获得您正在描述的异常。您发布的代码没有会导致您获得异常的问题。如果在调用Close()之前调用Flush(),它将强制写入磁盘,以便在调用Close时没有延迟()我通过在一两秒内打开和关闭它们数百次来打击文件,并且从不有这个问题。

更新:如果您的代码在调试时抛出了异常,VS仍然对该文件有一个打开的句柄。即使您更正了代码,它也会继续抛出该异常。我通常只是关闭并重新启动VS,以免弄乱我的项目设置并意外地将它们检查到源代码管理中。

答案 3 :(得分:0)

我通过保持文件打开解决了这个问题,这使得每次都无需重新打开它。