【问题标题】:File.Delete cannot delete a file because it is being used by another processFile.Delete 无法删除文件,因为它正被另一个进程使用
【发布时间】:2014-05-26 20:03:35
【问题描述】:

我在覆盖文件时遇到错误。如果它仍在工作,则无法找到关闭文件的方法。有人能帮助我吗 ?

        if (System.IO.File.Exists(Server.MapPath("/html/" + htmlname)))
        {
            System.IO.File.Delete(Server.MapPath("/html/" + htmlname));

            System.IO.File.WriteAllText(Server.MapPath("/html/" + htmlname), mailbody);

        }
        else
        {
            System.IO.File.WriteAllText(Server.MapPath("/html/" + htmlname), mailbody);
        }

【问题讨论】:

  • 根据我的经验,静态文件 IO 方法不适合处理文件句柄。我会改为使用 FileStream 并自己管理资源;你可能会踩到自己的脚。
  • @Jeff 你/我们会比 WriteAllText() 更好或不同地实现文件写入吗?
  • @Seration 您应该首先找到您写入该文件的所有位置。你错过了 Close()/Dispose() 吗?有什么异步的吗?如果没有更多上下文,您只会收到 10.000 条建议(如果您全部检查它们,您可能甚至会选择正确的...)
  • @Adriano 问题出在我写“文件”的时候。没有 close() 或 dispose() 选项。所以我真的不知道错过了什么
  • 如果您使用该静态方法编写,则无需关闭它(他们会这样做)。当你有一个流时,你必须关闭它(例如来自 File.Open)。您已经检查是否也以异步方式使用它(例如,您在不同的线程或多个请求中写入和读取)。这些只是(少数)一般情况,但如果没有更多信息(那个文件是什么?你在哪里写的?你在哪里读的?它是否被其他东西共享?

标签: c# asp.net io delete-file overwrite


【解决方案1】:

取自 msdn.com,它是这样说的: “指定的文件正在使用中。 -要么- 文件上有一个打开的句柄,操作系统是 Windows XP 或更早版本。此打开句柄可能来自枚举目录和文件。有关详细信息,请参阅如何:枚举目录和文件。"

看看这个:http://msdn.microsoft.com/en-us/library/system.io.file.delete.aspx

从长远来看,您自己进行一些搜索也会被证明是有效的。

最好的问候。

【讨论】:

  • 你可能是对的,但这是一个很大的猜测(特别是假设他在生产服务器或开发中使用 XP)。
  • 我真的不认为当使用 File.Delete 并且异常是 IOException 时,它是一个“猜测”。很有可能他测试了代码并且有一个打开的句柄(或者他正在用记事本查看它)并且有那个烦人的句柄。
  • 推测句柄来自枚举,操作系统是Windows XP。如果您删除它,那么您只需说“嘿,您的文件正在某处使用,搜索您使用它的位置”。几乎没有答案......
  • 鉴于我们没有更多信息,这个答案是可以回答的最佳答案。某处只有一个打开的手柄。他必须找到它。故事结束。
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多