【问题标题】:"is in use by other process"?“正在被其他进程使用”?
【发布时间】:2013-09-02 05:50:07
【问题描述】:

我的应用程序有一个日志文件,该日志文件最多包含 10 个日志文件 可以创建的。代码sn-p如下,

Stream logFileStream = null;
        string file = Config.LOG_FILE;
        m_strLogfile = Config.LOG_FILE + Config.LOG_FILE_EXT; 

 while (File.Exists(m_strGeneralFilePath + file + Config.LOG_FILE_EXT))
        {
            logFileStream = File.OpenRead(m_strGeneralFilePath + file + Config.LOG_FILE_EXT);
           // if(!logFileStream.Length.Equals(logSize))
            if (  logFileStream.Length > Convert.ToInt32(logSize)) // approx. 1MB 1.000.000
            {
                for (int i = 9; i > 0; i--)
                {
                    if (i == 9)
                    {
                        if (File.Exists(Config.LOG_FILE + i + Config.LOG_FILE_EXT))
                        {
                            File.Delete(Config.LOG_FILE + i + Config.LOG_FILE_EXT);
                        }
                    }
                    if (File.Exists(m_strGeneralFilePath + Config.LOG_FILE + i + Config.LOG_FILE_EXT))
                    {
                        System.IO.File.Move(m_strGeneralFilePath + Config.LOG_FILE + i + Config.LOG_FILE_EXT, m_strGeneralFilePath + Config.LOG_FILE + (i + 1) + Config.LOG_FILE_EXT);
                    }
                }
                System.IO.File.Move(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT, m_strGeneralFilePath + Config.LOG_FILE + "1" + Config.LOG_FILE_EXT);

            File.Create(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT);


            }               
        }
        if (logFileStream != null)
        {
            logFileStream.Close();
            logFileStream.Dispose();
        }

一旦涉及到System.IO.File.Move(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT, m_strGeneralFilePath + Config.LOG_FILE + "1" + Config.LOG_FILE_EXT);,它就会遇到一个异常,说“它被其他进程使用”,我该如何摆脱它? 请帮助我。 提前致谢。

我正在使用 .net 4.0 c# winforms。

【问题讨论】:

    标签: winforms c#-4.0 .net


    【解决方案1】:

    抛出异常是因为您正试图移动一个已在流对象“logFileStream”中打开以供读取的文件。所以你需要做的是在你开始移动它之前关闭这个文件流,而不是最后。

    你的代码应该是这样的,请注意我在你的 move 语句之前提供的 close 和 dispose 语句。

        Stream logFileStream = null;
                string file = Config.LOG_FILE;
                m_strLogfile = Config.LOG_FILE + Config.LOG_FILE_EXT; 
    
         while (File.Exists(m_strGeneralFilePath + file + Config.LOG_FILE_EXT))
                {
                    logFileStream = File.OpenRead(m_strGeneralFilePath + file + Config.LOG_FILE_EXT);
                   // if(!logFileStream.Length.Equals(logSize))
                    if (  logFileStream.Length > Convert.ToInt32(logSize)) // approx. 1MB 1.000.000
                    {
    // this is where you should close the file stream, assuming that you are not using the stream anymore.
                    logFileStream.Close();
                    logFileStream.Dispose();
    
                        for (int i = 9; i > 0; i--)
                        {
                            if (i == 9)
                            {
                                if (File.Exists(Config.LOG_FILE + i + Config.LOG_FILE_EXT))
                                {
                                    File.Delete(Config.LOG_FILE + i + Config.LOG_FILE_EXT);
                                }
                            }
                            if (File.Exists(m_strGeneralFilePath + Config.LOG_FILE + i + Config.LOG_FILE_EXT))
                            {
    
                                System.IO.File.Move(m_strGeneralFilePath + Config.LOG_FILE + i + Config.LOG_FILE_EXT, m_strGeneralFilePath + Config.LOG_FILE + (i + 1) + Config.LOG_FILE_EXT);
                            }
                        }
                        System.IO.File.Move(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT, m_strGeneralFilePath + Config.LOG_FILE + "1" + Config.LOG_FILE_EXT);
    
                    File.Create(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT);
    
    
                    }               
                }
    

    【讨论】:

    • 它是否发生在第一次迭代中?
    • @roopinin :- 我已经编辑了我的答案,我假设你不再使用流,在你计算出高度后我已经关闭了它。
    • @wizzardz-“你不再使用流”?我有点明白这一点。它仍然说它被另一个进程使用
    • @roopinin:答案已编辑,您尝试最新代码了吗?
    • 好的,哪个“move”语句正在为您执行,是第一个还是第二个?
    【解决方案2】:

    FileStream 之后没有关闭,所以变化是, 我刚换了行 File.Create(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT);使用块更方便。

    using (FileStream fs = File.Create(m_strGeneralFilePath + Config.LOG_FILE + Config.LOG_FILE_EXT))
                    {
                        fs.Flush();
                        fs.Close();
                    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多