Что может привести к тому, что этот код выдаст ошибку блокировки файла? - PullRequest
3 голосов
/ 15 августа 2010

Приведенный ниже код записывает текстовый файл в цикле while, и иногда он выдает ошибку, говорящую о том, что «процесс не может получить доступ к файлу, поскольку он используется другим процессом» и т. Д ... » Ошибка обычно происходит при «использовании (FileStream fs = File.OpenRead (filePath))» Есть ли способ проверить, что файл больше не используется, или способ правильно утилизировать средство записи текста?

 if (File.Exists(filePath))
                {
                        TextWriter sud = File.AppendText(filePath);
                        sud.WriteLine(GenericLIST[testloop].ToString());
                        sud.Close();
                        sud.Dispose();
                        using (FileStream fs = File.OpenRead(filePath)) 
                        {
                            using (StreamReader sr = new StreamReader(fs))
                            {
                                while (!sr.EndOfStream)
                                {
                                    richTextBox1.AppendText(sr.ReadLine());
                                }
                            }
                        } 
                    }

                else
                {

                    TextWriter sud = new StreamWriter(filePath);
                    sud.WriteLine(GenericLIST[testloop].ToString());
                    sud.Close();
                    sud.Dispose();
                    }

Ответы [ 4 ]

5 голосов
/ 17 февраля 2012

Я всегда использовал:

using (StreamReader reader = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
}

Согласно MSDN , File.OpenRead совпадает с:

new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)

(разница между FileShare of Read и ReadWrite)

1 голос
/ 15 августа 2010

Используйте превосходный ProcMon и сделайте так, чтобы он фильтровал весь доступ к файлу, и вы должны увидеть, какие другие процессы обращаются к файлу.Я использовал это для этого в прошлом, и это здорово.

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

0 голосов
/ 15 августа 2010

Это работает для меня. Вы используете этот файл где-нибудь еще? Возможно, у вас есть другое место в вашем коде, где вам не хватает Dispose?

Я бы также посоветовал вам использовать using последовательно. Есть несколько мест, где вы этого не сделали, и возникшее исключение может привести к неправильной утилизации файла.

0 голосов
/ 15 августа 2010

Здесь происходит то, что вы отпускаете файл, который добавляете, чтобы прочитать его снова.

Между sud.Close() и using(FileStream fs = File.OpenRead(filePath)) ЛЮБОЙ другой процесс, выполняющийся на вашем компьютере, может проверить и заблокировать ваш файл. Служба Index, или антивирусы, часто виноваты в этом.

Попробуйте отключить индексирование для папки и посмотрите, не появляется ли ваша ошибка по-прежнему так часто.

...