当'用户映射部分打开的文件无法执行请求的操作时'出了什么问题?'

时间:2009-06-26 06:23:34

标签: c# exception file-io

我正在开发一个应用程序,它可以读取和写入很多(但同步)到磁盘上的某个文件。但是,文件越大,我就越容易得到以下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内抛出。我怀疑异常与同时读写有关,所以试图限制对文件的访问。 lockMutex似乎都会增加例外数量而不是阻止它们。那到底是怎么回事?这个例外究竟意味着什么?如何防止它?

6 个答案:

答案 0 :(得分:6)

第一个解决方案是关闭防病毒软件。更好的是,您可以将该文件夹添加到防病毒软件的扫描例外列表中。

答案 1 :(得分:1)

您是否启用了实时病毒扫描软件?

我已经失去了病毒扫描软件引起文件锁定问题的次数。

答案 2 :(得分:1)

当Visual Studio调试器进入结并锁定PDB文件时,我看到了这条消息。

这可能与您的情况无关,但您可以通过使用名为“Unlocker”的可下载实用程序来确认该文件是否已被锁定(以及该文件是什么),该实用程序可以检测并删除文件和文件夹上的锁定。

答案 3 :(得分:0)

即使只有一个线程/进程,这仍然会发生吗?

如果是这样,那不是线程问题。

如果没有,那么您可能没有正确使用互斥锁/锁。也许您应该在这里发布相关代码。

答案 4 :(得分:0)

我正在写一个文件(打开,循环(写入),关闭)但是在错误之后复制了对rutine的调用...所以我最终得到“所请求的操作不能在一个文件上执行用户映射部分打开。“! 好吧,我删除了第二个电话,然后问题解决了。 似乎两个(打开/关闭)(打开/关闭)rutines在同一个文件上一个接一个地发生太快导致这个...... 一些开发人员建议打电话给gc。 检查每次I / O操作是否正确关闭。 不要太快执行完整(打开,循环(写入),关闭)。似乎当一个操作将在第二个请求到达时完成并且抛出问题。

答案 5 :(得分:0)

对我来说,这听起来像你有一些其他进程打开所有修改过的文件,其权限意味着你无法打开它进行修改。这可能是防病毒,在线备份,在线文件同步......