如何从 ftp 从特定文件夹下载文件
How to download files from ftp from particular folder
我创建了一个 windows 表单来从特定文件夹的 ftp 下载文件。
用户输入 ftp 详细信息以及用户名和密码以及将从中下载所有文件的文件夹名称。这将由用户设置一次,ftp describe 文件夹中的所有文件将每天下载。
FTP 文件夹名称为 MyFolder 的示例,其中 a.docx、b.docx 等它将每天下载 a.docx、b.docx,而不需要下载其他文件夹数据。
对于下载和文件列表,我使用以下功能。你能告诉我我做错了什么或者我该怎么做吗?
private void downloadFileFromFTP()
{
try
{
string[] files = GetFileList();
foreach (string file in files)
{
Download(file);
}
}
catch (Exception ex)
{
}
}
获取文件列表
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://" + txtftpAddress.Text + "/")); //txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential("UserNm", "passwd");
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();
}
// to remove the trailing '\n'
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 = "ftp://" + txtFtpAddress.Text.Trim() + "/" + "txtlodername.Text" + "/" + file;
Uri serverUri = new Uri(uri);
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return;
}
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file));
reqFTP.Credentials = new NetworkCredential("UserName", "mypass");
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Proxy = null;
reqFTP.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream writeStream = new FileStream("D\Temp" + 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");
}
}
我认为您的 Download
方法中的 3 行必须更正如下:
1.
string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + "txtlodername.Text" + "/" + file;
应该是:
string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + txtFTPFolderName.Text.Trim() + "/" + file;
2.
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file));
应该是:
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
3.
FileStream writeStream = new FileStream("D\Temp" + file, FileMode.Create);
应该是:
FileStream writeStream = new FileStream("D:\Temp\" + file, FileMode.Create);
我创建了一个 windows 表单来从特定文件夹的 ftp 下载文件。
用户输入 ftp 详细信息以及用户名和密码以及将从中下载所有文件的文件夹名称。这将由用户设置一次,ftp describe 文件夹中的所有文件将每天下载。
FTP 文件夹名称为 MyFolder 的示例,其中 a.docx、b.docx 等它将每天下载 a.docx、b.docx,而不需要下载其他文件夹数据。
对于下载和文件列表,我使用以下功能。你能告诉我我做错了什么或者我该怎么做吗?
private void downloadFileFromFTP()
{
try
{
string[] files = GetFileList();
foreach (string file in files)
{
Download(file);
}
}
catch (Exception ex)
{
}
}
获取文件列表
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://" + txtftpAddress.Text + "/")); //txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential("UserNm", "passwd");
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();
}
// to remove the trailing '\n'
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 = "ftp://" + txtFtpAddress.Text.Trim() + "/" + "txtlodername.Text" + "/" + file;
Uri serverUri = new Uri(uri);
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return;
}
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file));
reqFTP.Credentials = new NetworkCredential("UserName", "mypass");
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Proxy = null;
reqFTP.UsePassive = false;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream writeStream = new FileStream("D\Temp" + 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");
}
}
我认为您的 Download
方法中的 3 行必须更正如下:
1.
string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + "txtlodername.Text" + "/" + file;
应该是:
string uri = "ftp://" + txtFtpAddress.Text.Trim() + "/" + txtFTPFolderName.Text.Trim() + "/" + file;
2.
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(txtFtpAddress.Text + "/" + txtFTPFolderName + "/" + file));
应该是:
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
3.
FileStream writeStream = new FileStream("D\Temp" + file, FileMode.Create);
应该是:
FileStream writeStream = new FileStream("D:\Temp\" + file, FileMode.Create);