一般信息
我还在学习C#的过程。为了帮助自己,我试图创建一个程序,它将自动将我所有的本地项目与FTP服务器上的文件夹同步。这样,无论我在学校还是在家,我总是有相同的项目可供我使用。C#通过FTP下载所有文件和子目录
我知道有像Dropbox这样的程序已经为我做了这件事,但我想到了创造这样的事情,我自己会教会我很多。
问题
我对我的目标第一步是刚刚从我的FTP服务器上下载的所有文件,子目录和子文件。我已经设法从下面的代码下载一个目录中的所有文件。但是,我的代码只列出了主目录中的文件夹名称和文件。子文件夹和子文件不会被返回,也不会被下载。除此之外,服务器返回550错误,因为我试图下载文件夹,就好像它们是文件一样。我已经在这里工作了4个多小时,但我无法找到任何有关如何解决这些问题并使其工作的任何信息。为此,我希望你们能帮助我了:)
代码
public string[] GetFileList()
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
WebResponse response = null;
StreamReader reader = null;
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
request.KeepAlive = false;
request.UsePassive = false;
response = request.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;
}
}
private void Download(string file)
{
try
{
string uri = url + "/" + file;
Uri serverUri = new Uri(uri);
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return;
}
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url + "/" + file);
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
request.KeepAlive = false;
request.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream writeStream = new FileStream(localDestnDir + "\\" + file, FileMode.Create);
int Length = 2048;
Byte[] buffer = new Byte[Length];
int bytesRead = responseStream.Read(buffer, 0, Length);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream.Read(buffer, 0, Length);
}
writeStream.Close();
response.Close();
}
catch (WebException wEx)
{
MessageBox.Show(wEx.Message, "Download Error");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Download Error");
}
}
我已经改变了你的答案接受的答案,因为我已经学到了很多东西,并为所有的efford你已经把它!再次感谢! – icecub
您好那里我正在尝试使用您的库,但我需要SSL/TLS在我的连接上我通过使用EnableSsl = true的标准FTPrequest执行此操作可以在您的会话选项中设置吗? – Jay
我能够通过将FtpMode和FTPSecure分别设置为Passive和Explicit来获得此连接,伟大的库的递归功能非常出色,一个问题是有一个功能抓取新文件夹中不存在的文件,因此基本上只抓取新文件已经被复制的文件 – Jay