【问题标题】:Unable to delete file locked by same process -- weird!无法删除被同一进程锁定的文件——很奇怪!
【发布时间】:2010-03-23 19:50:08
【问题描述】:

我有一个用 PHP 编写的应用程序,它使用了一个用 C# 编写的 COM dll。 dll 通过组合其他两个图像文件来创建一个图像文件。然后 PHP 脚本接管删除两个源文件并重命名生成的组合文件的内务管理任务。

问题是 PHP 脚本无法删除其中一个源文件,因为它已被锁定。奇怪的是,锁定它的进程本身就是 Apache Web 服务器。

我已尝试更改 C# dll 以在退出之前处理所有位图和图形对象,但锁定仍然存在。我的问题是,我该怎么做才能让 dll 放手并释放文件锁。这很令人沮丧。

【问题讨论】:

  • 您必须先向我们展示您的代码,然后我们才能猜出问题出在哪里。

标签: c# php locking


【解决方案1】:

【讨论】:

  • 链接说什么?能概括一下吗?
【解决方案2】:

为确保您确实摆脱了图像上的所有潜在锁定,您可以将代码包装在 using 块中。

using(Bitmap myBitmap = new Bitmap())
{
  //use myBitmap in here
}

【讨论】:

  • 这项技术比我迄今为止尝试过的任何其他技术都更有效,但 dll 最终释放锁定需要 26 秒。有 DisposeDammit() 函数吗?
  • 释放锁不应该花这么长时间,除非使用这些图像的算法需要那么长时间。你是远程做的吗?这可能是带宽问题,也可能是算法问题,导致事情没有达到应有的效率。
  • 哎呀。我睡了(25);在我的 php 代码中用于调试目的。它现在消失了,程序现在正在运行。我还添加了一个 unset($comobj);告诉 php 释放 comobj 变量。感谢您的帮助。
【解决方案3】:

应用程序绝对可以从自身锁定文件。例如:

using(FileStream fs = File.Open("somefile.txt", FileMode.Open))
{
    File.Delete("somefile.txt"); // Exception: File already in use.
}

在清理 PHP 文件之前,您需要确保所有打开的文件句柄都已关闭。

【讨论】:

    【解决方案4】:

    作为最后的手段,您可以使用Unlocker 实用程序(通过命令行)解锁文件。

    【讨论】:

    • 我喜欢解锁器,但这是一个基于服务器的应用程序,客户端将无法通过其网络浏览器与解锁器 gui 进行交互。
    • 我当然明白。如果你的服务器上安装了 Unlocker,你的 PHP 代码可以调用它(exec 函数)。
    • 对不起。我没看你这句话的最后一部分。不知道有一种命令行方式可以让解锁器发挥它的魔力。很高兴知道。谢谢。
    • 没问题。当您达到 15 个代表点时,您只需点赞一个有用的答案或评论即可表示感谢。
    猜你喜欢
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    相关资源
    最近更新 更多