我现在使用的代码:
string[] Files = GetFileList();
ArrayList arrDirectories = new ArrayList();
if (Files != null)
{
foreach (string dir in Files)
{
arrDirectories.Add(dir);
}
}
if (!arrDirectories.Contains(dirName))
{
Sync(dirName, reqFTP, response, ftpStream);
}
方法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;
}
}
我最终在arrDirectories中获得的是我的ftp服务器中的所有文件,目录和子目录。问题是每个文件,目录和子目录都在它自己的索引中。 例如,我在arrDirectories中的索引0中看到:test 然后在索引1中我看到:testsub 然后在索引2中我看到:test.jpg
但实际上test在根目录下,testsub正在测试中,test.jpg正在testub下。 问题是,当我检查目录是否已存在时:
if (!arrDirectories.Contains(dirName))
如果它是单个目录,例如test,则没有问题。 但是,如果我要检查的目录是否存在,则像test / testsub这样的子目录 然后即使它存在于我的ftp服务器上也永远不会找到它。
所以如果我必须检查像test / testsub或test / test1 / test2 / test3这样的目录......我应该在GEtFileList方法中首先更改什么?然后如何循环arrDirectories可能需要一个递归?
答案 0 :(得分:0)
尝试使用此代码' 首先将目录结构放入字符串数组中:
string[] Directories = Directory.GetDirectories(@"c:\windows\Temp", "*.*", SearchOption.AllDirectories);

然后使用linq检查您的目录是否存在
bool DirectoryExists = !String.IsNullOrEmpty(Directories.Where(d => d.ToLower().Contains(@"Directory Name...")).FirstOrDefault());

答案 1 :(得分:0)
是的,你是对的,最简单的方法 - 递归调用GetFileList() 并将结果放入列表,而不是字符串 这是您修改后的代码
static public void GetFileList(List<string> list,string sroot)
{
WebResponse response = null;
StreamReader reader = null;
try
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + Host+sroot));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(Username, Password);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails ;
reqFTP.Proxy = null;
reqFTP.KeepAlive = false;
reqFTP.UsePassive = false;
response = reqFTP.GetResponse();
reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
string file;
while (!reader.EndOfStream )
{
if (line.StartsWith("-"))
{
file = sroot + "/" + line.Substring(57);
list.Add(file);
}
else if (line.StartsWith("d"))
{
file = sroot + "/" + line.Substring(57);
list.Add(file+"/");
GetFileList(list, file);
}
line = reader.ReadLine();
}
}
catch (Exception ex)
{
if (reader != null)
{
reader.Close();
}
if (response != null)
{
response.Close();
}
}
return;
}
这是电话
List<string> filelist = new List<string>();
GetFileList(filelist, "");
foreach (string s in filelist )
Console.WriteLine(s.Substring(1));
所有文件夹末尾都有“/”(随意将文件夹包含在列表中)。 使用上一个答案的方法很容易构建本地文件列表。