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

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

запрошенная операция не может быть выполняется в файле с отображением пользователя секция открыта.

происходя из:

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, Int32 bufferSize, FileOptions options)
   at System.IO.StreamWriter.CreateFile(String path, Boolean append)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
   at System.IO.File.WriteAllText(String path, String contents, Encoding encoding)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at TestApp.Program.Main()

как вы можете видеть, исключение выбрасывается изнутри File.WriteAllText. Я подозревал, что исключение должно было сделать при одновременном чтении и записи, поэтому старались ограничить доступ к файлу. Как lock и Mutex казалось, увеличивалось количество исключений вместо того, чтобы предотвращать их. Так что же все-таки происходит? Что именно означает это исключение и как его можно предотвратить?

6 ответов


Я писал в файл (open, loop (пишет),close), но после ошибки дублировал вызов rutine... поэтому я заканчиваю "запрошенная операция не может быть выполнена в файле с открытым разделом, сопоставленным с пользователем."! Ну, я удалил второй звонок и проблема решена. Кажется, что два (open/close) (open/close) рутины над одним и тем же файлом происходят слишком рано один за другим... Некоторые разработчики предлагают вызвать ГК. Проверьте правильность закрытия каждого ввода-вывода операция. Не выполнять complete(open,loop (пишет),close) слишком рано. Кажется, что когда одна операция будет завершена, а второй запрос прибывает, и это бросает проблему.


первым решением будет отключить свой антивирус. Еще лучше вы можете добавить папку в список исключений сканирования вашего антивируса.


У вас включено программное обеспечение для сканирования вирусов в реальном времени?

Я потерял счет количества раз, когда проблемы блокировки файлов оказались вызваны программным обеспечением для сканирования вирусов.


Я видел это сообщение, когда отладчик Visual Studio попадает в узел и блокирует файл PDB.

Это может не иметь отношения к вашей ситуации, но вы можете подтвердить, заблокирован ли файл (и что) с помощью загружаемой утилиты под названием "Unlocker", которая может обнаруживать и удалять блокировки файлов и папок.


Это все еще происходит даже с одним потоком / процессом?

Если это так,это не проблема с потоками.

Если нет, то вы можете неправильно использовать мьютекс/блокировку. Возможно, вам стоит разместить соответствующий код здесь.


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