如何在treeView1 SelectedNode中循环到最后一个子节点并返回到0级?

时间:2014-12-22 21:18:54

标签: c# .net winforms treeview nodes

我有这个方法:

public void RemoveDirectoriesRecursive(TreeNode ParentNode)
        {
            if (ParentNode.GetNodeCount(true) > 0)
            {
                int i = oParentNode.GetNodeCount(true);
                foreach (TreeNode subnode in ParentNode.Nodes)
                {
                    string ss = (string)subnode.Tag;
                    if (ss == "file")
                    {
                        DeleteFile(treeView1.SelectedNode.FullPath + "\\" + subnode.Text, false);
                    }
                }
            }
        }

ParentNode是treeView1.SelectedNode

我想要做的是首先循环到最后一个子节点,例如,如果所选节点文本是B 如果在B内有子节点是目录,那么到达最后一个:

B / C / d / E

如果E中有文件要删除文件,首先要搜索E文件。 然后返回一次级别到D也删除那里的文件,如果有的话。 然后到C然后删除B中的文件,如果有的话。

然后逐个删除目录:首先删除最后一个:B / C / D / E然后删除B / C / D之前的那个然后B / C然后删除B

我知道确定变量ss是文件还是目录。 DeleteFile方法每次都会删除单个文件。 如果ss是目录,我也有一个方法RemoveDirectory。

问题是如何进行递归循环?如果所有子节点(如果有子节点)有任何子节点,则首先清除所有文件,然后删除子节点(目录)。

这是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;
            }
            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方法,也在我调用RemoveDirectoriesRecursive方法的内部:

private void RemoveDirectory(string remoteFile, bool fileordir)
        {
            RemoveDirectoriesRecursive(treeView1.SelectedNode);
            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 == true)
            {
                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();
        }

如果例如treeView1中的选定节点是/test.jpg或/b/test.jpg

,则DeleteFile方法正在工作

如果treeView1中的selectednode用于exampe / b或/ tempdir并且目录为空,则RemoveDirectory方法也在工作。

问题在于所选节点内部子节点和子节点中有更多文件。

修改

这是我现在尝试的。 我从RemoveDirectory中调用了RemoveDirectoriesRecursive。

private void RemoveDirectory(string remoteFile, bool fileordir)
        {
            remoteFile = remoteFile.Replace('\\', '/');
            if (remoteFile.StartsWith("root"))
            {
                remoteFile = remoteFile.Replace("root", string.Empty);
            }
            string deleteRequest = txtHost.Text + remoteFile;
            RemoveDirectoriesRecursive(treeView1.SelectedNode,deleteRequest);

然后在RemoveDirectoriesRecursive中:

public void RemoveDirectoriesRecursive(TreeNode ParentNode, string path)
{
    if (ParentNode.GetNodeCount(true) >= 0)
    {
        // go over all the nodes
        foreach (TreeNode subnode in ParentNode.Nodes)
        {
            string ss = (string)subnode.Tag;

            // if the node is a file then delete it
            if (subnode.Tag != null)
            {
                if (ss.Equals("file"))
                {
                    DeleteFile(path + "\\" + subnode.Text, false);
                }
            }

            // otherwise, if the node is a directory call the recursion
            else
            {
                RemoveDirectoriesRecursive(subnode, path + "\\" + subnode.Text);
            }

        }
    }

在这种情况下,我试图删除空目录。 ParentNode是目录名A,里面有两个子节点(子目录)name 1和2

因此变量路径包含:ftp.newsxpressmedia.com/A Abd ParentNode包含A

问题是我在RemoveDirectory中调用RemoveDirectoriesRecursive方法的地方并不好,因为每次它一遍又一遍地调用它都会被调用。

我搞砸了。

我应该在哪里调用RemoveDirectoriesRecursive方法?应该走的路是什么?

2 个答案:

答案 0 :(得分:0)

你描述它的方式,听起来你需要有两个完全独立的递归调用。您可以为函数DeleteFolders提供布尔参数。如果是,则该功能将删除文件夹,否则只会删除文件。然后你只需要两次函数,一次是DeleteFolders = true,一次是DeleteFolders = false。所有递归调用只会将DeleteFolders的值传递给下一个级别。只有根级别才会为参数提供truefalse值。

答案 1 :(得分:0)

我不确定如何表示节点的名称,但我对您的函数进行了一些更改以使其递归。 它可能需要一些小的改动才能适合代码中路径的表示方式。

public void RemoveDirectoriesRecursive(TreeNode ParentNode, string path)
{
    if (ParentNode.GetNodeCount(true) > 0)
    {
        // go over all the nodes
        foreach (TreeNode subnode in ParentNode.Nodes)
        {
            string ss = (string) subnode.Tag;

            // if the node is a file then delete it
            if (ss.Equals("file"))
            {
                DeleteFile(path + "\\" + subnode.Text, false);
            } 

            // otherwise, if the node is a directory call the recursion
            else if (ss.Equals("directory"))
            {
                RemoveDirectoriesRecursive(subnode, path + "\\" + subnode.Text);
            }
        }
    }

    // finally after we deleted inner files and directories
    // delete this directory as well
    RemoveDirectory(path, true);
}

希望这有帮助。