2013-09-02 3 views
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.

ответ

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


       }    
      } 
+0

@ wizzardz- даже сделав это упомянутый такой же .. –

+0

происходит ли это на первой итерации? – wizzardz

+0

@roopinin: - Я отредактировал свой ответ, я предположил, что вы больше не используете поток, я его закрыл после того, как вы рассчитали высоту. – wizzardz

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(); 
       } 
Смежные вопросы