2013-02-08 3 views
5

В принципе, я хочу создать файл, если он не существует, а затем написать ему сообщение.Процесс не может получить доступ к файлу при использовании StreamWriter

if (!File.Exists(filePath + fileName)) 
    File.Create(filePath + fileName); 
StreamWriter sr = new StreamWriter(filePath + fileName,false); 

Как справиться с этой ошибкой?

Процесс не может получить доступ к файлу 'c: \ blahblah', потому что он используется другим процессом.

ответ

14

File.Create открывает FileStream (http://msdn.microsoft.com/en-us/library/d62kzs03.aspx).

Поскольку вы его не уничтожили, файл остается заблокированным, и последующие обращения к файлу будут сбой из-за этой ситуации, если они выполняются из других дескрипторов (то есть других FileStream или всего StreamWriter).

Этот код показывает, как вы должны работать с IDisposable объектами как FileStream:

if (!File.Exists(filePath + fileName)) 
{ 
    File.Create(filePath + fileName).Dispose(); 

    using(StreamWriter sr = new StreamWriter(filePath + fileName,false)) 
    { 

    } 
} 
+2

Зачем беспокоиться о файле.Создать? Просто передайте путь к файлу конструктору StreamWriter и не создавайте дополнительный объект, который вы не используете. –

+0

@ChrisDunaway Да, абсолютно, но я отвечал на «почему вторая часть не может получить доступ к файлу?». Вы знаете. –

3

Почему бы просто не использовать StreamWriter конструктор, который принимает имя файла?

StreamWriter sr = new StreamWriter(filePath + fileName); 

От MSDN:

Параметр путь может быть имя файла, включая файл на акцию Universal Naming Convention (UNC). Если файл существует, он перезаписывается; в противном случае создается новый файл.

Очень мелкие точки, но вы могли бы рассмотреть возможность использования Path.Combine при конкатенации имена файлов и пути к папкам.

+0

Должен ли я создать его первым и убедиться, что он существует или нет? – 2013-02-08 15:15:43

+0

Вы прочитали цитату? 'Если файл существует, он перезаписывается; в противном случае ** создается новый файл **. ' –

2

Упрощение кода с помощью одного метода для создания и открытия файла:

using (FileStream fs = File.OpenWrite(path)) 
{ 
    Byte[] info = new UTF8Encoding(true) 
         .GetBytes("This is to test the OpenWrite method."); 

    fs.Write(info, 0, info.Length); 
} 

MSDN: (File.OpenWrite Method)

Открывает существующий файл или создает новый файл для записи.

+0

У этого должно быть больше приоритетов. – Rob

Смежные вопросы