Сбой программы после попытки использовать недавно созданный файл. C # - PullRequest
3 голосов
/ 26 мая 2010

Так вот мой код

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

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

Ответы [ 4 ]

6 голосов
/ 26 мая 2010

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

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

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

С MSDN :

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

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

2 голосов
/ 26 мая 2010

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

var outputFile = new StreamWriter(File.Open(pathName, FileMode.OpenOrCreate));
1 голос
/ 26 мая 2010

После File.Create поток все еще открыт.

Вы можете использовать:

File.Create(pathName).Close();

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

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

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

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

0 голосов
/ 26 мая 2010

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

...