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

C# 如何在ftp服务器上递归地创建子目录,直到完成所有目录和带有大写字符的目录?,c#,.net,winforms,ftp,C#,.net,Winforms,Ftp,这是我用来在ftp服务器上创建目录的方法 public void createDirectory(string newDirectory) { try { string FtpHost = f.Host + "/" + newDirectory; if (!FtpHost.ToLower().StartsWith("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;
        }
例如,我需要进行递归循环的问题和原因如下:

如果在文本框中键入如下目录:c/1/2/3/4/5,在我的ftp服务器上,c 1/2/3/4下的子/子目录不存在尚未创建,它将引发异常。但是,如果我手动在文本框中键入一次c/1,它将很好地创建目录。然后我输入c/1/2将创建它。然后我输入c/1/2/3将创建精细。然后我输入c/1/2/3/4将创建精细。然后,如果键入或粘贴到文本框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,循环应该会发现直到6目录已经存在,所以只能创建/7/8

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

网络例外

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

第295行是:

ftpResponse1 = (FtpWebResponse)ftpRequest.GetResponse();

您可以尝试使用
/
拆分目录名,然后分别创建分层目录

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();
    }
}
string[]folderArray=directory.Split('/');
字符串folderName=“”;
for(int i=0;i
1。一些FTP服务器可能区分大小写(例如托管在*nix操作系统上),其他服务器可能区分大小写但保留大小写(例如Windows)。在后一种情况下“/a/B/c”和“/a/B/c”是相同的。另外,2,你是对的:你不能假设创建一个文件夹将创建所有中间文件夹:你需要在路径中以增量方式创建每个文件夹。当你在交互式命令行FTP会话(不是GUI工具)中执行这些操作时,会发生什么(记录会话并将会话包括在Q中)?(如果您要进行非平凡的FTP操作,首先要学习FTP以及目标服务器在不同情况下对不同命令的反应。)很难理解您的评论:1。将信息添加到可以清楚显示的问题中(注释一段中的所有内容都很难理解)。2.包括之前FTP服务器的状态(例如,存在哪个文件夹),以及异常的类型和消息。TL;DR:让问题变得容易回答。请不要做
catch(Exception ex)
,因为这是一种导致错误代码的糟糕做法。您应该只捕获可以处理的特定异常。
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();
    }
}