我在 Visual Studio 2010 中编写了一个 winform 应用程序。在其中一种形式中,用户可以浏览本地系统并选择一个图像,因此该应用程序会将该图像(使用 File.Copy() 方法)复制到其文件夹中。问题是当用户想要删除该图像(File.Delete() 方法)时,我收到如下错误:
无法删除此文件,因为它已被另一个进程使用。
我不知道这个错误是什么意思,因为我没有在其他进程中使用图像文件。
我在 Visual Studio 2010 中编写了一个 winform 应用程序。在其中一种形式中,用户可以浏览本地系统并选择一个图像,因此该应用程序会将该图像(使用 File.Copy() 方法)复制到其文件夹中。问题是当用户想要删除该图像(File.Delete() 方法)时,我收到如下错误:
无法删除此文件,因为它已被另一个进程使用。
我不知道这个错误是什么意思,因为我没有在其他进程中使用图像文件。
无法删除此文件,因为它已被另一个进程使用。
该消息对程序员没有太大帮助,因为当您开发代码时,其他进程几乎总是您的进程。
图像文件很可能会发生这种情况,从图像文件创建图像或位图对象会锁定文件。创建锁是因为 GDI+ 在文件内容上创建了内存映射视图,这是一种强大的优化,可将位图数据排除在分页文件之外。对大图像很重要,它们可以包含数兆字节的像素数据。
在您在代码中显式调用其 Dispose() 方法之前,该锁将一直保留。因此,请确保在尝试将图像保存回来之前已完成。在极少数情况下,您可能需要创建图像的副本以允许您处理原始图像,请使用带有 Image 参数的 Bitmap() 构造函数重载。
发生的事情是,当我们从 C# 代码复制文件并将其粘贴时,即使该程序维护了指向原始/复制文件的链接/信息。这不会发生在程序未复制的文件或文件夹中已存在的文件上。
另一种方法是触发复制 shell/dos 命令。本文中提供了一种方法
dos中的正常复制命令就像
复制 originalfilenamewithpath 目标文件名withpath。
要了解有关复制命令的更多信息,请转到 dos 并写入copy /?
并按 Enter。
同意 Conrad 的建议,尽管在某些极端情况下 Process Explorer 可能不可靠,或者您可以尝试Unlocker