【问题标题】:What's wrong when 'the requested operation cannot be performed on a file with a user-mapped section open?'当“无法对打开了用户映射部分的文件执行请求的操作时,出了什么问题?”
【发布时间】:2009-06-26 06:23:34
【问题描述】:

我正在开发一个应用程序,该应用程序对磁盘上的某个文件进行大量读写(但是是同步的)。但是,文件越大,我得到以下 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 似乎都增加了异常的数量而不是阻止它们。那么到底发生了什么?这个异常到底是什么意思,如何预防?

【问题讨论】:

    标签: c# exception file-io


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我认为我的情况也是如此。不确定问题的确切原因是什么以及应该如何预防问题。
      【解决方案3】:

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

      我已经记不清文件锁定问题是由病毒扫描软件引起的次数了。

      【讨论】:

        【解决方案4】:

        当 Visual Studio 调试器陷入困境并锁定 PDB 文件时,我看到了此消息。

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 我确定只有一个进程和一个线程,所以我可能不需要锁或互斥锁。但是,如果这个进程试图读取(或写入)一个正在被释放的文件(从正在访问它的读取器或写入器),会发生什么?此外,异常消息的实际含义是什么?
          • 对稍后添加的答案的回复:不,我没有运行任何防病毒程序..
          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2011-06-07
            • 2010-11-21
            • 1970-01-01
            • 2018-09-22
            • 1970-01-01
            • 2011-12-11
            • 1970-01-01
            • 2012-10-08
            • 1970-01-01
            相关资源
            最近更新 更多