如何添加递归循环来删除包含所有子目录和文件的目录?

时间:2014-12-22 09:51:48

标签: c# .net winforms recursion ftp

在这种情况下,我从上下文条菜单中选择选项,在这种情况下“删除” 然后我检查我在treeView1中选择的节点是文件还是目录。

private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            bool file = false;
            if (e.ClickedItem.Text == "Delete")
            {
                if (treeView1.SelectedNode.Tag != null)
                {
                    string s = (string)treeView1.SelectedNode.Tag; // this is casting
                    if (s == "file")
                    {
                        file = false;
                        DeleteFile(treeView1.SelectedNode.FullPath,file);
                    }
                }
                else
                {
                    file = true;
                    DeleteFile(treeView1.SelectedNode.FullPath,file);
                }
            }
        }

然后在DeleteFile方法中,如果它是一个目录makeDirectory,我检查它是否是一个文件生成DeleteFile。

private void DeleteFile(string remoteFile, bool fileordir)
        {
            remoteFile = remoteFile.Replace('\\', '/');
            if (remoteFile.StartsWith("root"))
            {
                remoteFile = remoteFile.Replace("root", string.Empty);
            }
            string deleteRequest = txtHost.Text + remoteFile;
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + deleteRequest);
            if (fileordir == false)
            {
                request.Method = WebRequestMethods.Ftp.DeleteFile;
            }
            else
            {
                request.Method = WebRequestMethods.Ftp.RemoveDirectory;
            }
            request.Credentials = new NetworkCredential(txtUsername.Text, txtPassword.Text);
            request.Proxy = null;
            request.UseBinary = false;
            request.UsePassive = true;
            request.KeepAlive = false;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(responseStream);
            sr.ReadToEnd();
            string StatusCode = response.StatusDescription;
            sr.Close();
            response.Close();
        }

问题是我是否想要具有内部子目录和文件的RemoveDirectory。 例如,如果remoteFile包含:/b/c/d/e/test.jpg那么它的文件就会删除test.jpg 此外,如果remoteFile是:/ test.jpg它是一个文件,它将删除test.jpg

但是现在我想删除我在treeView中选择的目录一个目录节点,但我不知道是否以及有多少子目录和文件可能在里面。

例如,如果在remoteFile中我有:/ b / c / d / e / f / gi将收到错误,因为RemoveDirectory不知道将其删除为一个字符串我必须首先进行递归循环删除:/ b / c / d / e / f / g这将删除子目录g 然后/ b / c / d / e / f将删除目录f / b / c / d / e然后b / c / d然后/ b / c然后/ b

如果在那些子目录中有某个文件/ s我还需要以某种方式在递归循环中使用FileDelete。

当我从treeView中选择一个节点并且它是一个目录并且需要创建RemoveDirectory时,我如何构建递归循环?

2 个答案:

答案 0 :(得分:1)

要递归删除目录,您的" RemoveDirectory"方法应该:

  • 接受要删除的目录的路径
  • 读取该目录中的所有(名称)文件和子目录(直接在其中,没有更深层次)
  • 删除找到的所有文件
  • 对于所有子目录:递归调用此相同的RemoveDirectory方法,使用此子目录作为参数
  • 最后删除现在空的目录

答案 1 :(得分:1)

尝试这样的事情

public static class FooClass
    {
        public void DeleteDirectory(string path)
        {
            foreach (string directory in Directory.EnumerateDirectories(path))
            {
                DeleteDirectory(directory);
            }
            foreach (string file in Directory.EnumerateFiles(path))
            {
                File.Delete(file);
            }
            Directory.Delete(path);
        }
    }

然后,您只需要将起始路径传递给该函数,它将递归删除最远目录的所有文件,删除它,并继续运行直到达到指定的目录级别。