如何在我的ftp服务器上创建递归子目录,直到完成所有具有大写字符的目录和目录?

时间:2014-12-17 10:53:53

标签: c# .net winforms ftp

这是我用来在我的ftp服务器上创建目录的方法。

public void createDirectory(string newDirectory)
        {
            try
            {
                string FtpHost = f.Host + "/" + newDirectory;
                if (!FtpHost.ToLower().StartsWith("ftp://"))
                    FtpHost = "ftp://" + FtpHost;
                ftpRequest = (FtpWebRequest)WebRequest.Create(FtpHost);
                ftpRequest.Credentials = new NetworkCredential(f.Username, f.Password);
                ftpRequest.UseBinary = true;
                ftpRequest.UsePassive = true;
                ftpRequest.KeepAlive = true;
                ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                ftpResponse1 = (FtpWebResponse)ftpRequest.GetResponse();
                ftpResponse1.Close();
                ftpRequest = null;
            }
            catch (Exception ex) { Console.WriteLine(ex.ToString()); }
            return;
        }

问题以及为什么我需要进行递归循环就是这种情况:

如果在textBox中我键入了这样的目录:c / 1/2/3/4/5并且在我的ftp服务器上c 1/2/3/4下的子/子目录不存在之前尚未创建会抛出异常。但是,如果我手动输入textBox一次c / 1它将创建目录罚款。然后我键入c / 1/2将创建它很好。然后我键入c / 1/2/3将创建罚款。然后我输入c / 1/2/3/4就可以了。然后,如果键入或粘贴到textBox c / 1/2/3/4/5,它将创建它,因为所有目录1/2/3/4已经存在,因此它将创建目录5而不是问题。

出于某种原因,如果其中一些目前尚不存在,则它不会理解或知道创建子/子目录。它不会创建c / 1/2/3/4/5/6/7/8如果已创建1/2/3/4/5/6/7,它将不会创建目录8。

这就是为什么我需要做一些循环递归,它还会检查我的服务器上是否存在目录,然后创建它们,如果不是,例如:c / 1/2/3/4/5/6 / 7/8 循环应该检查c / 1是否存在,如果没有创建然后创建c / 1/2然后c / 1/2/3直到c / 1/2/3/4/5/6/7/8并且如果目录c / 1/2/3/4/5/6已经存在,但我输入了c / 1/2/3/4/5/6/7/8循环应该发现直到已存在的目录已经存在,所以只创建/ 7/8

在所有情况下异常都是相同的但是我确定这是我需要以某种方式进行递归循环的问题,它还将检查子/子目录是否已经存在。

引发WebException

远程服务器返回错误:(550)文件不可用(例如,找不到文件,没有访问权限)

System.Net.WebException was caught
  HResult=-2146233079
  Message=The remote server returned an error: (550) File unavailable (e.g., file not found, no access).
  Source=System
  StackTrace:
       at System.Net.FtpWebRequest.CheckError()
       at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
       at System.IO.Stream.Close()
       at System.Net.ConnectionPool.Destroy(PooledStream pooledStream)
       at System.Net.ConnectionPool.PutConnection(PooledStream pooledStream, Object owningObject, Int32 creationTimeout, Boolean canReuse)
       at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
       at System.Net.FtpWebRequest.GetResponse()
       at FTP_ProgressBar.FtpProgress.createDirectory(String newDirectory) in c:\ftp_progressbar\FTP_ProgressBar\FtpProgress.cs:line 295
  InnerException: 

第295行是:

ftpResponse1 = (FtpWebResponse)ftpRequest.GetResponse();

1 个答案:

答案 0 :(得分:0)

您可以尝试使用/拆分目录名称,然后单独创建分层目录。

string[] folderArray = directory.Split('/');
string folderName = "";
for (int i = 0; i < folderArray.Length; i++)
{
    if(!string.IsNullOrEmpty(folderArray[i]))
    {
        folderName = string.IsNullOrEmpty(folderName) ? folderArray[i] : folderName + "/" + folderArray[i];
        WebRequest request = WebRequest.Create("ftp://" + ftpAddress + "/" + folderName);
        request.Method = WebRequestMethods.Ftp.MakeDirectory;
        request.Credentials = new NetworkCredential(username, password);
        var response = request.GetResponse();
        var test = response.ToString();
    }
}