如果目录不存在,这就是我检查和创建目录的方式:
private void MakeDir(string dirName)
{
FtpWebResponse response = null;
Stream ftpStream = null;
try
{
FtpWebRequest reqFTP;
string[] Files = GetFileList();
ArrayList arrDirectories = new ArrayList();
if (Files != null)
{
foreach (string dir in Files)
{
arrDirectories.Add(dir);
}
}
if (!arrDirectories.Contains(dirName))
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + f.Host + "/" + dirName));
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
reqFTP.UseBinary = true;
reqFTP.KeepAlive = false;
reqFTP.Proxy = null;
reqFTP.Credentials = new NetworkCredential(f.Username, f.Password);
response = (FtpWebResponse)reqFTP.GetResponse();
ftpStream = response.GetResponseStream();
}
}
catch (Exception ex)
{
if (ftpStream != null)
{
ftpStream.Close();
}
if (response != null)
{
response.Close();
}
}
}
这是方法GetFileList:
public string[] GetFileList()
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
WebResponse response = null;
StreamReader reader = null;
try
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + f.Host + "/"));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(f.Username, f.Password);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
reqFTP.Proxy = null;
reqFTP.KeepAlive = false;
reqFTP.UsePassive = false;
response = reqFTP.GetResponse();
reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), 1);
return result.ToString().Split('\n');
}
catch (Exception ex)
{
if (reader != null)
{
reader.Close();
}
if (response != null)
{
response.Close();
}
downloadFiles = null;
return downloadFiles;
}
}
在MakeDir中,我给出了一个目录名,例如名称为:D
如果目录名D不存在,它将创建目录D.直到这里没有问题。 但是如果我给出的目录是D / Test1 / Test2 / Test3 / Test4 / Test5并且让我们说只有D存在那么现在我需要以某种方式添加一个递归循环到
另一种情况可能是我已经有了一个目录结构:D / Test1 / Test2 / Test3,我给了一个目录来创建D / Test1 / Test2 / Test3 / Test4 / Test5,我知道D / Test1 / Test2 / Test3已经存在所以我只需要创建:D / Test1 / Test2 / Test3 / Test4然后是D / Test1 / Test2 / Test3 / Test4 / Test5
但是在所有情况下它应该像这样创建它:D / Test1 / Test2 / Test3将在D / Test1 / Test2下创建Test3而D / Test1 / Test2 / Test3 / Test4将在D / Test1 / Test2 / Test3下创建
如何在MadeDir方法中构建递归循环?
最后,我们的目标是以递归方式创建目录结构。
答案 0 :(得分:0)
忘记了FTP部分,因为我认为这不会有所不同,它应该是这样的:
public void Sync(string src, string target){
EnsureTargetExists(target);
CopyFiles(src, target);
foreach(var dir in GetDirectories(src)){
Sync(src+"/"+dir, target+"/"+dir);//recurence call
}
}
这就是你需要的所有重复性。