我有这个方法:
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方法?应该走的路是什么?
答案 0 :(得分:0)
你描述它的方式,听起来你需要有两个完全独立的递归调用。您可以为函数DeleteFolders
提供布尔参数。如果是,则该功能将删除文件夹,否则只会删除文件。然后你只需要两次函数,一次是DeleteFolders
= true,一次是DeleteFolders
= false。所有递归调用只会将DeleteFolders
的值传递给下一个级别。只有根级别才会为参数提供true
或false
值。
答案 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);
}
希望这有帮助。