如何使用File.Delete和Directory.Delete调试删除目录的问题

时间:2013-01-11 10:48:02

标签: c# asp.net-mvc-3 debugging

这个证明很难调试。让我们从我的情况开始:

我有一个使用.Net 4使用C#开发的ASP.Net MVC3 Web应用程序。系统的一部分允许用户上传zip文件。这样做很好,并保存了zip文件。还有一个Windows服务,它会定期查找新的zip文件,提取它们,做一些工作,然后重新拉回它们。 (我使用System.IO.Compression作为压缩内容)。这部分一切正常,经过处理后我最终得到了类似的结构。

Object1Folder
 \_ Input.zip
 \_ ExtractedFolder
 \_ Output.zip

还有一个功能允许用户删除该项,并且要求是删除对象文件夹,在本例中为“Object1Folder”。因为我需要删除所有子文件夹和文件,所以我有以下递归函数来完成工作......

public static void DeleteDirectory(string directoryPath)
{
    string[] files = Directory.GetFiles(directoryPath);
    string[] directories = Directory.GetDirectories(directoryPath);

    foreach (string file in files)
    {
        File.SetAttributes(file, FileAttributes.Normal);
        File.Delete(file);
    }

    foreach (string directory in directories)
    {
        DeleteDirectory(directory);
    }

    Directory.Delete(directoryPath, true);
}

最初称之为......

DeleteDirectory("C:\\Objects\\Object1Folder");

但它不起作用!首先,没有抛出错误,代码似乎成功执行,这很烦人。但结果是只删除了“Input.zip”文件。 “ExtractedFolder”和“Output.zip”文件仍然存在。

据我所知,代码是合理的。我无法看到它不会尝试删除剩余的文件和文件夹。不幸的是,我们没有在目标服务器上安装VS,因此我无法单步执行代码并检查它是否尝试删除它们。请指出你是否可以看到这是一个潜在的问题?

到目前为止,我最好的猜测是它是某种权限问题。有趣的(也许)是当我去手动清理问题时(即Windows资源管理器删除“Object1Folder”它说“拒绝”并要求我用管理员权限按钮确认它确实存在。

我知道你们所有人都很难解决这个问题,但我正在寻找我应该检查以解决这个问题的事情。我应该确保哪些事情具有正确的权限?他们需要什么权限?我有一个很好的方法来调试这个问题吗?如果其他东西持有这些文件(可能来自Windows服务的提取过程),我该如何检查这是否是问题?

有关该服务器可能有所帮助的一些信息:它正在运行带有Service Pack 1的“Windows Server 2008 R2 Datacenter”并且是64位的。为Web应用程序分配了一个用户,该用户是“Users”和“IIS_IUSRS”的成员。

如果你们中的任何人需要一些额外的信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

查看服务器上的事件日志;您可能会在那里找到异常\错误消息。

您可以考虑使用Directory.Delete(path, true),以便在一次通话中删除该文件夹及其所有内容(除非我无法正确理解您的代码)。

查看正在使用的文件。如果正在使用文件,则操作系统无法删除它。因此,请确保正确释放所有文件。

最后,您无法强制使用这些文件,因此您最终可能会编写一个每晚运行的干净脚本来删除不需要的文件和文件夹。

答案 1 :(得分:0)

您真的应该为解压缩的文件使用临时目标文件夹。 使用它们后,您可以尝试删除它们,如果失败则只需将它们留下即可。 写入非临时文件夹的权限不应该真正提供给驻留在iis中的演示应用程序。