Процесс не может получить доступ к файлу «C: \ file.xml», так как он используется другим процессом - PullRequest
0 голосов
/ 31 марта 2012
 DirectoryInfo dir=new DirectoryInfo(path);
 if (!dir.Exists)
  {
      Directory.CreateDirectory(path);
      File.Create(path + "\\file.xml");

      StreamWriter sw =new StreamWriter(path + "\\file.xml");
      sw.Flush();
      sw.Write("<?xml version='1.0' encoding='utf-8' ?><project></project>");
  }

ошибка:

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

почему? Как закрыть файл?

Ответы [ 4 ]

2 голосов
/ 31 марта 2012

От MSDN

Объект FileStream, созданный этим методом (File.Create), имеет значение FileShare по умолчанию None; никакой другой процесс или код не могут получить доступ к созданному файлу, пока не будет закрыт оригинальный дескриптор файла.

Так что обходной путь

  using(FileStream fs = File.Create(path + "\\file.xml"))
  {
       Byte[] info = new UTF8Encoding(true).GetBytes("<?xml version='1.0' encoding='utf-8' ?><project></project>");
       fs.Write(info, 0, info.Length);
  }

РЕДАКТИРОВАТЬ: Изменено удаление создания StreamWriter и использование FileStream
Однако мне не нравится этот способ, как предлагает MSDN.
StreamWriter имеет конструктор, который может получить FileStream, но я подумал, что если мы используем

   using(StreamWriter sw = new StreamWriter(File.Create(path + "\\file.xml")))
   { 
      sw.Write("<?xml version='1.0' encoding='utf-8' ?><project></project>");
   }

мы вернемся к проблеме блокировки. Тем не менее, я проверил, и это работает.
Вероятно, конструктор StreamWriter делает некоторые трюки с FileStream, возвращаемым File.Create.

1 голос
/ 04 июля 2012

Изменить

File.Create(path + "\\file.xml");

На

File.Create(path + "\\file.xml").Close();
1 голос
/ 31 марта 2012

используйте File.Create или StreamWriter, а не оба

0 голосов
/ 31 марта 2012

Do sw.Close(); после того, как вы позвонили Write();

Возможно, вам лучше использовать XmlDocument. Затем вы можете добавлять узлы как узлы и т. Д.

XmlDocument имеет встроенную функцию сохранения, поэтому вам не нужно управлять чем-либо вроде потоковой записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...