Ошибка System.IO.Exception: "Запрошенная операция не может быть выполнена в файле с открытым пользователем разделом".

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

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)

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

Любые идеи о том, что произошло?

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

lock(file){ write to file code here }

Ответ 4

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

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

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

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

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