2010-02-26 3 views
2

Код:Блокировка файлов при использовании file.move в C# ... Как я могу остановить или исправить эту

 String tempFile = Path.GetTempFileName(), read = ""; 
     TextReader pending = new StreamReader("c:\\pending.txt"); 
     TextWriter temp = new StreamWriter(tempFile); 

     read = pending.ReadLine(); 

     while ((read = pending.ReadLine()) != null) 
     { 
      temp.WriteLine(read); 
     } 

     pending.Close(); 
     temp.Close(); 

     File.Delete("c:\\pending.txt"); 
     File.Move(tempFile, "c:\\pending.txt"); 

Файл pending.txt создается при запуске программы, если она не существует. Этот код удаляет первую строку файла. Когда я отлаживаю код, я замечаю, что

 File.Move(tempFile, "c:\\pending.txt"); 

блокирует файл, и я больше не могу писать ему.

+1

Что именно вы имеете в виду? – SLaks

+0

Это похоже на разрешающую проблему. – SLaks

+0

Ничего. В тегах проводника Windows отображается заблокированный значок, но остальная часть моего кода была неправильной. Прости. но спасибо за использование наконечника. Мне нужно больше взглянуть на readBlock. – Mtlca401

ответ

3

Вы должны закрыть StreamReader и StreamWriter в using заявления, как это:

String tempFile = Path.GetTempFileName(), read = ""; 
using(TextReader pending = new StreamReader("c:\\pending.txt")) 
using(TextWriter temp = new StreamWriter(tempFile)) 
{ 

    read = pending.ReadLine(); 

    while ((read = pending.ReadLine()) != null) 
    { 
     temp.WriteLine(read); 
    } 
} 

File.Delete(@"c:\pending.txt"); 
File.Move(tempFile, @"c:\pending.txt"); 
+0

Я также предлагаю, чтобы, если вы копируете файл самостоятельно, это делается в блоках фиксированного размера (4K, 8K?), Более эффективный, чем линейный. – Andrew

+0

Я пробовал это, но он по-прежнему дает те же результаты. Что происходит, у меня есть окна 7, кстати, как только программа нажимает «File.Move», я получаю изображение блокировки на значке файла. После этого я ничего не могу записать в файл. Похоже, что он пишет, но файл не изменяется, когда я открываю его через проводник Windows. Я не получаю ошибок, говорящих об использовании файла. – Mtlca401