【问题标题】:error in deleting a file with File.Delete() method使用 File.Delete() 方法删除文件时出错
【发布时间】:2012-05-05 05:36:21
【问题描述】:

我在 Visual Studio 2010 中编写了一个 winform 应用程序。在其中一种形式中,用户可以浏览本地系统并选择一个图像,因此应用程序会将该图像(使用 File.Copy() 方法)复制到其文件夹. 问题是当用户想要删除该图像时(File.Delete() 方法),我收到这样的错误:

无法删除此文件,因为它已被另一个进程使用。

我不知道这个错误是什么意思,因为我没有在其他进程中使用图像文件。

【问题讨论】:

  • 能否请您发布您正在使用的代码?
  • 您可以使用process explorer 查找具有句柄的进程。我的猜测是您在某处忘记了.Close(),但这将证实这一点。
  • 下载进程监视器:它可以准确地显示哪些进程正在使用该文件:technet.microsoft.com/en-us/sysinternals/bb896645 我敢打赌你无意中用你自己的 winform 应用程序打开了它;)
  • 我在表单中的图片框控件中显示图像。你认为这可能是问题吗??!!

标签: c# winforms visual-studio-2010


【解决方案1】:

无法删除此文件,因为它已被另一个进程使用。

该消息对程序员没有太大帮助,因为当您开发代码时,其他进程几乎总是您的进程。

这很可能发生在图像文件中,从图像文件创建图像或位图对象会在文件上放置一个。创建锁是因为 GDI+ 在文件内容上创建了内存映射视图,这是一种强大的优化,可将位图数据排除在页面文件之外。对于大型图像来说非常重要,它们可以包含数兆字节的像素数据。

在您在代码中显式调用其 Dispose() 方法之前,该锁将一直保留。因此,请确保在尝试将图像保存回来之前已完成。在极少数情况下,您可能需要创建图像的副本以允许您处理原始图像,请使用带有 Image 参数的 Bitmap() 构造函数重载。

【讨论】:

  • 非常感谢,我认为这是我的解决方案,我会测试它并告诉你结果。
【解决方案2】:

发生的情况是,当我们从 C# 代码复制文件并粘贴时,即使该程序维护了指向原始/复制文件的链接/信息。这不会发生在程序未复制的文件或文件夹中已存在的文件上。

另一种方法是触发复制 shell/dos 命令。这个article中提供了一种方法

dos中正常的复制命令是这样的

copy originalfilenamewithpathdestinationfilenamewithpath.

要了解有关复制命令的更多信息,请转到 dos 并写 copy /? 并按 Enter。

【讨论】:

    【解决方案3】:

    同意康拉德的建议,尽管在某些极端情况下 Process Explorer 可能不可靠,或者您可以尝试Unlocker

    【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多