2010-05-26 3 views
3

Так вот мой кодСбой программы после попытки использовать недавно созданный файл. C#

if (!File.Exists(pathName)) 
{ 
    File.Create(pathName); 
} 
StreamWriter outputFile = new StreamWriter(pathName,true); 

Но всякий раз, когда я запустить программу в первый раз путь с файлом получает создан. Однако, как только я доберусь до строки StreamWriter, моя программа выйдет из строя, потому что говорит, что мой fie используется другим процессом. Есть ли что-то, что мне не хватает между инструкциями File.Create и StreamWriter?

+0

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

+0

Код отдела отдела избыточности. –

ответ

1

После создания файла File.Create поток по-прежнему открыт.

Вы могли бы использовать:

File.Create(pathName).Close(); 

Это создает файл и закрывает его непосредственно.

Больше принял это:

using (var file = File.Create(pathName)) { 
    // use the file here 
    // it will be closed when leaving the using block 
} 

также: Почему вы создаете файл, который вы создаете 2 строки далее в коде? StreamWriter constructor (с append = true) создаст или добавит файл, если он не существует.

+0

Хороший вопрос. И ответ я не знаю. Я еще не знаком с C#, и это моя экспериментальная программа, с которой я играю. –

6

File.Create не просто создает файл - он также открывает его для чтения и записи. Таким образом, файл действительно используется, когда вы пытаетесь создать StreamWriter: своим собственным процессом.

StreamWriter создаст файл, указанный в pathName, если он не существует, так что вы можете просто удалить File.Exists чек и упростить код это:

using (var writer = new StreamWriter(pathName, true)) 
{ 
    // ... 
} 

От MSDN:

Конструктор StreamWriter (поток)

Инициализирует ew экземпляра класса StreamWriter для указанного файла [...]. Если файл существует, его можно либо перезаписать, либо добавить. Если файл не существует, этот конструктор создает новый файл.

+1

Даже это слишком много, не так ли? Он может просто использовать писателя с именем файла и логическим для открытия. –

+0

Легче создать «StreamWriter» с помощью нового StreamWriter (pathName, true). Это создаст файл, если он не существует и добавится к нему, если это произойдет. (Edit: Я вижу @ Anthony сказал то же самое :)). –

+0

Действительно ... Исправлено! – dtb

0

File.Create возвращает FileStream. Почему бы вам не сохранить это и передать его конструктору StreamWriter вместо передачи имени пути?

2

Как уже упоминалось, File.Create создает FileWriter, открывающий ваш файл. Но помимо этого, нет причин проверять наличие файла, прежде чем пытаться открыть файл. Просто скажите , чтобы открыть существующий файл, если он есть:

var outputFile = new StreamWriter(File.Open(pathName, FileMode.OpenOrCreate)); 
+0

Это не открывает файл для добавления, верно? – dtb

+0

Хороший вопрос о проверке существования. Это не только бессмысленно, но и может сделать приложение непригодным для [условий гонки] (http://en.wikipedia.org/wiki/Race_condition). – Patrick

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