“正在被另一个进程使用”?

时间:2013-09-02 05:50:08

标签: winforms c#-4.0 .net

我的应用程序有一个日志文件,日志文件最多有10个日志文件 可以创建。代码段如下,

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。

2 个答案:

答案 0 :(得分:2)

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

您的代码应该是这样的,请注意我在移动声明之前提供的关闭和处理声明。

    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);


                }               
            }

答案 1 :(得分:0)

之后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();
                }