Что не так, если «запрошенная операция не может быть выполнена для файла с открытым разделом, сопоставленным пользователем»? - PullRequest
6 голосов
/ 26 июня 2009

Я занимаюсь разработкой приложения, которое много читает и записывает (но синхронно) определенный файл на диске. Однако чем больше размер файла, тем чаще я получаю следующее исключение 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 ]

6 голосов
/ 03 сентября 2010

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

1 голос
/ 16 августа 2010

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

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

1 голос
/ 27 июня 2009

Есть ли у вас в режиме реального времени антивирусное программное обеспечение?

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

0 голосов
/ 19 октября 2010

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

0 голосов
/ 01 октября 2010

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

0 голосов
/ 26 июня 2009

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

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

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

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