删除文件夹时文件正在使用错误

时间:2013-08-23 14:32:00

标签: c# asp.net

我正在尝试删除文件夹,但收到以下错误消息:

该进程无法访问该文件。另一个进程正在使用该文件。

string target_dir="D:\\projectpath\\page";
if (Directory.Exists(target_dir))
Directory.Delete(target_dir, false);

如何解决此错误?

3 个答案:

答案 0 :(得分:4)

看起来该文件被其他进程锁定。如果在读取/写入时您忘记丢弃流读取器/写入器并将非托管处理程序泄漏到文件中,则可能会发生这种情况。

例如,如果您使用以下代码从文件中读取:

StreamReader reader = new StreamReader(fileName);
string contents = reader.ReadToEnd();

并且您永远不会释放阅读器,文件将被锁定。正确的方法是在使用语句中包装诸如Streams和StreamReaders之类的IDisposable资源:

using (StreamReader reader = new StreamReader(fileName))
{
    string contents = reader.ReadToEnd();
}

另一方面,如果文件被某个其他外部进程锁定到您的应用程序,那么除了杀死此进程之外,您几乎无能为力。

答案 1 :(得分:2)

我认为从表面上看,你的问题应该是显而易见的:文件正被其他东西使用,所以你无法删除它所在的目录。如果有办法“强制删除”文件,那么可能导致其他程序崩溃。我建议捕获错误并将其记录或显示给用户,这样他们就可以决定是否真的要删除正在使用的文件。

如果您必须删除该文件,您可以查看:

Using C#, how does one figure out what process locked a file?

一旦你知道这个过程是什么,你可以杀掉它,这应该释放文件。同样,这不是一个好的做法,只应在特殊情况下使用。

答案 2 :(得分:0)

要删除目录,您必须拥有正确的权限。

 var target_dir = "D:\\projectpath\page";
  var isWriteAccess = false;
  try
  {
    var collection = Directory.GetAccessControl(target_dir)
      .GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
    if (collection.Cast<FileSystemAccessRule>().Any(rule => rule.AccessControlType == AccessControlType.Allow))
    {
      isWriteAccess = true;
    }
  }
  catch (UnauthorizedAccessException ex)
  {
    isWriteAccess = false;
  }
  catch (Exception ex)
  {
    isWriteAccess = false;
  }

  if (!isWriteAccess)
  {
    MessageBox.Show("no access to directory.");
    // Handle here close and kill the blocking process

  }
  else
  {
      Directory.Delete(target_dir, false);
  }
}