2011-05-02 92 views
0

我收到错误后:解决例外文件关闭的StreamWriter

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不显示文件的处理,执行过程中,可以直接访问的二进制文件或与微软的Visual C#快递2008年

没有其他进程调试模式下运行应该使用此文件,因为它是我的应用程序创建的原始文件。

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

根据堆栈溢出其他的解决方案,在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。

+0

你为什么写自己的日志?你可以使用一个框架,如log4net来写这个日志吗?因为我可以很快给你答案。 – 2011-05-02 20:46:11

+0

可以将FileShare.None更改为FileShare.ReadWrite吗? – DarkSquirrel42 2011-05-02 20:50:33

+1

如果不使用“使用”,应始终使用try-finally来确保始终调用Dispose。第一次测试可能会在刷新和处理之间失败? – 2011-05-02 20:51:24

回答

0

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

0
  1. 如果你想做的正确,你必须花一些时间。或
  2. 使用tracinglogging框架。
  3. 我猜你是与Visual Studio宿主进程调试。尝试禁用它,并检查文件锁定问题是否消失。

禁用的

Project - Properties - Debug - x Enable Visual Studio hosting process 

的复选框,这也可能是你在你的终结之一期间应用程序关闭跟踪,其中StreaWriter已经关闭。您可以通过使用一个Critical Finalizer

此致解决这个问题, 阿洛伊斯·克劳斯

0

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

正如其他人所指出的那样,还有其他各种日志选项,但我相信这可能会为您提供一个从您站立的位置快速前进的途径,而不是后退前进。

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

0

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

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

+0

此外,该类正在保持非托管资源,其中计算机上的数量有限。你需要实现IDisposable和Finalizer。 http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx – 2011-05-03 04:37:57