0

我的应用程序有一个日志文件,该日志文件最多可以创建 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。

4

2 回答 2

2

抛出异常是因为您试图移动已打开以在流对象“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);


                }               
            }
于 2013-09-02T06:29:01.997 回答
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();
                }
于 2013-09-03T04:26:13.363 回答