【问题标题】:Delete folder and all subfolders plus files [duplicate]删除文件夹和所有子文件夹以及文件[重复]
【发布时间】:2012-04-01 00:47:48
【问题描述】:

可能重复:
Recursive delete of files and directories in C#

我正在尝试删除根文件夹中的所有文件和文件夹,但由于某些文件超过 256 或其他限制,我的程序不断崩溃。

我需要做的是转到最后一个文件夹,删除所有文件,然后删除该文件夹,然后一直到根文件夹,然后将其删除。

我不知道如何做到这一点,请问有人可以提供一种简单的方法吗?

非常感谢您的帮助

我正在使用 C#, 代码是:

    private void RemoveDirectory(DirectoryInfo directory)
    {
        RemoveReadOnly(directory);

        directory.Delete(true);

        bool directoryExists = true;

        while (directoryExists)
            directoryExists = Directory.Exists(directory.FullName);

        SendProgressMessage(string.Format("Removed {0}", directory.FullName));
    }

【问题讨论】:

  • 您使用的代码是什么以及您遇到的确切错误?
  • 发布您的代码,发布异常详细信息,发布我们可以查看的内容,以便我们开始提供帮助。见Writing the perfect question
  • @Robar: 不,这是类似的stackoverflow.com/q/2223007/284240
  • SamWrighton:这可能是一个无限循环while (directoryExists)directoryExists = Directory.Exists(directory.FullName);,因为Directory.Exists 不会改变任何东西。

标签: c# file recursion directory delete-file


【解决方案1】:

这与树排序等非常相似。

您需要一个递归函数来获取每个叶节点(一个没有子文件夹的文件夹)并删除该叶中的所有文件,然后删除叶本身。

基本伪代码是:

function main()
{
    deleteNode(first node);
}

function deleteNode(node)
{
    foreach(child in node.children)
    {
        deleteNode(child);
        delete the child which should now be empty
    }

    delete all files in this node
}

【讨论】:

    【解决方案2】:

    您应该使用以下围绕 shell api 的函数(如果您的错误是路径长为 256 个字符):

    [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern bool DeleteFile(string path);
    

    对于目录:

    [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern bool RemoveDirectory(string path);
    

    并确保您拥有 CharSet.Unicode,ansi 会将您的路径限制在 260 (MAX_PATH)。

    http://msdn.microsoft.com/en-us/library/aa363915%28VS.85%29.aspx

    http://msdn.microsoft.com/en-us/library/aa365488%28v=vs.85%29.aspx

    此函数可以将较长的路径删除为 256 个字符。

    【讨论】:

    • 如果解决了他的问题,他应该使用非托管函数。也许他选择了错误的问题开始。
    • 也许你是对的。 stackoverflow.com/a/2223040/284240
    • 我试过了,它没有删除文件夹或其任何内容
    【解决方案3】:

    删除你的 c:\temp 目录:

    Directory.Delete(@"c:\temp", true);
    

    你不能这样做有什么原因吗?

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多