1

我收到错误消息:

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。

4

4 回答 4

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

禁用复选框

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

也可能是您在 StreaWriter 已经关闭的应用程序关闭期间跟踪您的终结器之一。您可以通过使用关键终结器来解决此问题

你的,阿洛伊斯克劳斯

于 2011-05-02T20:58:15.863 回答
0

我希望能为您提供快速解决方案的是替换FileMode.OpenorCreateFileMode.Append;

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

在我看来,您的代码是将流编写器返回到调用上下文的类的片段。我会让你的类实现 IDisposable 将你的关闭更改为 Dispose (以实现 IDisposable),然后让你的消费者将调用包装到 using(yourLogClass logger = new yourLogClass())... 等以确保调用关闭每次使用。

于 2011-05-02T21:04:16.233 回答
0

调用此类中的方法的代码在调用 open 方法后不会调用您的 close() 方法。根据您发布的代码,我假设有一个单独的 open 方法。如果该方法被多次调用,那么您将得到您所描述的异常。您发布的代码没有会导致您遇到异常的问题。如果在调用 Close() 之前调用 Flush(),它将强制写入磁盘,以便在调用 Close() 时没有延迟有这个问题。

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

于 2011-05-03T04:30:00.530 回答
0

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

于 2011-05-04T17:49:19.300 回答