Ошибка System.IO.Exception: «Запрошенная операция не может быть выполнена для файла с открытым разделом, сопоставленным пользователем». - PullRequest
35 голосов
/ 20 августа 2009

Я получил очень странное IOException при записи в файл XML:

System.IO.IOException: The requested operation cannot be performed on a file with a user-mapped section open.

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.Xml.XmlTextWriter..ctor(String filename, Encoding encoding)
   at System.Xml.XmlDocument.Save(String filename)

Ошибка произошла, когда я вызвал функцию Save (string) XmlDocument.

Есть идеи, что случилось?

Ответы [ 4 ]

41 голосов
/ 20 августа 2009

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

Функция поиска в Process Explorer должна быть в состоянии сообщить вам.

10 голосов
/ 20 августа 2009

Похоже, файл, который вы пытаетесь записать, уже открыт в другом месте, либо вашим кодом, либо другим процессом.

У вас есть файл, открытый в редакторе? У вас есть какой-то другой код, который читает его, но забывает закрыть его?

Вы можете использовать Process Explorer , чтобы узнать, какой процесс имеет дескриптор открытого файла - используйте команду Find / Find handle or DLL....

7 голосов
/ 15 ноября 2012

Попробуйте исключить файл из вашего проекта во время отладки. Я обнаружил, что на самом деле VS2010 содержал файл XML. Затем вы можете выбрать «Показать все файлы» в обозревателе решений, чтобы проверить файл XML после отладки.

Блокировка остановит проблему при выполнении нескольких записей.

lock(file){ write to file code here }
5 голосов
/ 20 марта 2012

ОС или Framework могут дать вам сбой, если вы попытаетесь снова и снова открывать один и тот же файл в узком цикле, например

 while (true) {
   File.WriteAllLines(...)
 }

Конечно, вы на самом деле не хотите этого делать. Но ошибка в вашем коде может привести к этому. Сбой происходит не из-за вашего кода, а из-за проблемы с Windows или .NET Framework.

Если вам нужно очень быстро написать множество файлов, вы можете добавить небольшую задержку с помощью Thread.Sleep (), которая также, похоже, отвлекает ОС от вас.

 while (i++<100000000) {
   File.WriteAllLines(...)
   Thread.Sleep(1);
 }
...