C# 如何在ftp服务器上递归地创建子目录,直到完成所有目录和带有大写字符的目录?
这是我用来在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://"))
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();
}
}