【问题标题】:File Delete does not work文件删除不起作用
【发布时间】:2015-11-13 10:24:17
【问题描述】:

我编写了一个从文件所在位置删除文件的函数。代码如下:

if (File.Exists(strPath + "/FLV/" + flvvideoname))
{
    File.Delete(strPath + "/FLV/" + flvvideoname);
}

'strPath' 是目录的路径。执行代码时,文件并不总是被删除。一遍又一遍地运行相同的代码将删除该文件。当我解决这个问题时,断点不会越过文件删除行,我也没有看到任何错误。如果断点超过了文件删除行,则说明文件已被正确删除。

我该如何解决这个问题?

【问题讨论】:

  • 您确定没有其他进程访问该文件吗?
  • 确保运行 IIS 进程的用户有权修改此目录。
  • Delete does not delete a file that is open for normal I/O or a file that is memory mapped.
  • 如果满足条件则执行File.Delete,如果没有抛出异常则说明文件已被删除。
  • 使用System.IO.Path.Combine(strPath, "FLV", flvvideoname)

标签: c# asp.net


【解决方案1】:

文件创建的句柄有时不能被释放。尝试调用

GC.Collect();
GC.WaitForPendingFinalizers();

删除前。

还可以查看这个 SO 问题:Delete a file being used by another process

编辑:

除了避免调用 GC.Collect()(出于 Boas Enker 指出的原因)之外,您可能希望循环等待文件 - like this

【讨论】:

  • 不是一个好主意。 GC.Collect 对整个运行时有巨大的影响。它也不能解决问题,使系统更难预测
  • @BoasEnkler 我已经尝试过这种方法并且它有效。有其他选择吗?
  • @AhmedMujtaba 有一些脏的,比如使用Thread.Sleep(),但你不会这样走。
  • 问题是为什么文件被锁定。是否有更多代码访问该文件?您是否正在刷新和处置访问该文件的其他参与者?
  • 我不同意,我更想在循环中检查操作是否成功,而不是调用 gc.collect。在小型原型应用程序中,这并不重要,但是当拥有一个普通的大型 sizd 应用程序并且 gc.collect 在这样一个可能会重复很多时间的“细节”事件中时,你可能会搞砸整个垃圾收集。 ...参见例如 stackoverflow.com/questions/118633/… 重试操作(如果没有其他可能)只会产生局部影响,不会对整个运行时产生负面影响
【解决方案2】:

我确定问题不在文件删除中。可能是当您从数据库中检索文件名或动态设置某些变量时,您不是在第一个页面加载时执行此操作,甚至在回发时也是如此。因此,如果您要动态检索文件名,请执行下一步:

if (!IsPostBack){//function for retrieving data from database

//your_variable = some_value; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2016-09-16
    • 2016-10-13
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多