解决关闭StreamWriter后使用的异常文件

本文关键字:异常 文件 StreamWriter 解决 | 更新日期: 2023-09-27 17:54:10

我得到错误:

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语句,但这是不可行的,因为数据写入不会发生在简单或简短的复合语句中。日志类使用编写器委托将数据写入文件。

根据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框架要赶紧关闭了文件。

我在Windows 7上使用64位架构的MS Visual c# 2008 Express。

解决关闭StreamWriter后使用的异常文件

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

禁用

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

它也可能是你在应用程序关闭期间跟踪你的一个终结器,而streamwriter已经关闭。你可以通过使用临界终结器

来解决这个问题

你的,阿洛伊斯•克劳斯

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

正如其他人指出的那样,还有无数其他的日志记录选项,但我相信这可能会为您提供一种快速前进的方法,而不是从后退到前进。

在我看来,你的代码是一个类的片段,它将流写入器返回到调用上下文。我会让你的类实现IDisposable改变你的close to Dispose(实现IDisposable),然后让你的消费者将调用包装成using(yourLogClass logger = new yourLogClass())…

调用该类方法的代码在调用open方法后不会调用close()方法。根据你发布的代码,我假设有一个单独的开放方法。如果该方法被调用了不止一次,那么你将得到你所描述的异常。你发布的代码没有问题,会导致你得到的异常。如果你在调用Close()之前调用Flush(),它将强制写入磁盘,这样当你调用Close()时就不会有延迟。我已经在一两秒钟内打开和关闭文件数百次了,从来没有遇到过这个问题。

更新:如果你的代码抛出了一个异常,而你正在调试它,VS仍然有一个打开的句柄在该文件。即使您已经更正了代码,它也会继续抛出该异常。我通常只是关闭并重新启动VS,以免混淆我的项目设置,并意外地将它们检入源代码控制。

我通过保持文件打开来解决这个问题,这样每次都不需要重新打开它。