提供一个helper类,从FTP服务器下载文件到本地
public class FTPHelper
{
public static FtpFileInfo[] GetFtpFileInfos(string ftpPath, string userName, string passWord)
{
LinkedList<FtpFileInfo> linkedList = new LinkedList<FtpFileInfo>();
var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath));
reqFtp.UsePassive = false;
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(userName, passWord);
reqFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
var response = (FtpWebResponse)reqFtp.GetResponse();
var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string fileDetail = reader.ReadLine();
while (fileDetail != null)
{
linkedList.AddLast(new FtpFileInfo(fileDetail));
fileDetail = reader.ReadLine();
}
reader.Close();
response.Close();
return linkedList.ToArray();
}
/// <summary>
/// 从ftp下载文件夹到本地
/// </summary>
/// <param name="sourceDirectoryPath">源数据文件夹地址(备注:结尾不要“/”)</param>
/// <param name="targetDirectoryPath">目标数据文件夹地址(备注:结尾不要“/”)</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public static bool DownLoadDirectory(string sourceDirectoryPath, string targetDirectoryPath, string username, string password)
{
try
{
var ftpFileInfos = GetFtpFileInfos(sourceDirectoryPath, username, password);
if (ftpFileInfos != null && ftpFileInfos.Count() > 0)
{
foreach (var file in ftpFileInfos)
{
string fullSourcePath = sourceDirectoryPath + "/" + file.FileName;
string fullTargetPath = targetDirectoryPath + "/" + file.FileName;
if (file.UnixFileType == "d")
{
if (!string.IsNullOrEmpty(file.FileName.Replace(".", "")))
{
DownLoadDirectory(fullSourcePath, fullTargetPath, username, password);
}
}
else
{
DownLoadFile(fullSourcePath, targetDirectoryPath, username, password);
}
}
}
return true;
}catch
{
return false;
}
}
/// <summary>
/// 从ftp下载文件到本地文件夹
/// </summary>
/// <param name="fullSourcePath">ftp文件完整地址</param>
/// <param name="targetDirectoryPath">目标文件夹路径</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public static void DownLoadFile(string fullSourcePath, string targetDirectoryPath, string username, string password)
{
Uri uri = new Uri(@fullSourcePath);
string directory = System.IO.Path.GetFullPath(targetDirectoryPath);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
string FileName = System.IO.Path.GetFullPath(directory) + System.IO.Path.DirectorySeparatorChar.ToString() + System.IO.Path.GetFileName(filename); //创建一个文件流
FileStream fs = null;
Stream responseStream = null;
try
{
//创建一个与FTP服务器联系的FtpWebRequest对象
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
//设置请求的方法是FTP文件下载
request.Method = WebRequestMethods.Ftp.DownloadFile;
//连接登录FTP服务器
request.Credentials = new NetworkCredential(username, password);
//获取一个请求响应对象
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
//获取请求的响应流
responseStream = response.GetResponseStream();
//判断本地文件是否存在,如果存在,删除
if (File.Exists(FileName))
{
File.Delete(FileName);
}
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
fs = File.Create(FileName);
if (fs != null)
{
int buffer_count = 65536;
byte[] buffer = new byte[buffer_count];
int size = 0;
while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
{
fs.Write(buffer, 0, size);
}
fs.Flush();
fs.Close();
responseStream.Close();
}
}
finally
{
if (fs != null)
fs.Close();
if (responseStream != null)
responseStream.Close();
}
}
}
public class FTPHelper
{
public static FtpFileInfo[] GetFtpFileInfos(string ftpPath, string userName, string passWord)
{
LinkedList<FtpFileInfo> linkedList = new LinkedList<FtpFileInfo>();
var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath));
reqFtp.UsePassive = false;
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(userName, passWord);
reqFtp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
var response = (FtpWebResponse)reqFtp.GetResponse();
var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string fileDetail = reader.ReadLine();
while (fileDetail != null)
{
linkedList.AddLast(new FtpFileInfo(fileDetail));
fileDetail = reader.ReadLine();
}
reader.Close();
response.Close();
return linkedList.ToArray();
}
/// <summary>
/// 从ftp下载文件夹到本地
/// </summary>
/// <param name="sourceDirectoryPath">源数据文件夹地址(备注:结尾不要“/”)</param>
/// <param name="targetDirectoryPath">目标数据文件夹地址(备注:结尾不要“/”)</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public static bool DownLoadDirectory(string sourceDirectoryPath, string targetDirectoryPath, string username, string password)
{
try
{
var ftpFileInfos = GetFtpFileInfos(sourceDirectoryPath, username, password);
if (ftpFileInfos != null && ftpFileInfos.Count() > 0)
{
foreach (var file in ftpFileInfos)
{
string fullSourcePath = sourceDirectoryPath + "/" + file.FileName;
string fullTargetPath = targetDirectoryPath + "/" + file.FileName;
if (file.UnixFileType == "d")
{
if (!string.IsNullOrEmpty(file.FileName.Replace(".", "")))
{
DownLoadDirectory(fullSourcePath, fullTargetPath, username, password);
}
}
else
{
DownLoadFile(fullSourcePath, targetDirectoryPath, username, password);
}
}
}
return true;
}catch
{
return false;
}
}
/// <summary>
/// 从ftp下载文件到本地文件夹
/// </summary>
/// <param name="fullSourcePath">ftp文件完整地址</param>
/// <param name="targetDirectoryPath">目标文件夹路径</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public static void DownLoadFile(string fullSourcePath, string targetDirectoryPath, string username, string password)
{
Uri uri = new Uri(@fullSourcePath);
string directory = System.IO.Path.GetFullPath(targetDirectoryPath);
string filename = System.IO.Path.GetFileName(uri.LocalPath);
string FileName = System.IO.Path.GetFullPath(directory) + System.IO.Path.DirectorySeparatorChar.ToString() + System.IO.Path.GetFileName(filename); //创建一个文件流
FileStream fs = null;
Stream responseStream = null;
try
{
//创建一个与FTP服务器联系的FtpWebRequest对象
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
//设置请求的方法是FTP文件下载
request.Method = WebRequestMethods.Ftp.DownloadFile;
//连接登录FTP服务器
request.Credentials = new NetworkCredential(username, password);
//获取一个请求响应对象
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
//获取请求的响应流
responseStream = response.GetResponseStream();
//判断本地文件是否存在,如果存在,删除
if (File.Exists(FileName))
{
File.Delete(FileName);
}
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
fs = File.Create(FileName);
if (fs != null)
{
int buffer_count = 65536;
byte[] buffer = new byte[buffer_count];
int size = 0;
while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
{
fs.Write(buffer, 0, size);
}
fs.Flush();
fs.Close();
responseStream.Close();
}
}
finally
{
if (fs != null)
fs.Close();
if (responseStream != null)
responseStream.Close();
}
}
}
public class FtpFileInfo
{
public string UnixFileType { get; set; }
public string Permission { get; set; }
public string NumberOfHardLinks { get; set; }
public string Owner { get; set; }
public string Group { get; set; }
public string Size { get; set; }
public string LastModifiedDate { get; set; }
public string FileName { get; set; }
public string FileDetail { get; set; }
public FtpFileInfo(string fileDetail)
{
this.FileDetail = fileDetail;
int counter = 1;
string[] propertyBlocks = fileDetail.Split(' ');
foreach (string propertyBlock in propertyBlocks)
{
switch (counter)
{
case 1:
{
//unix file types & permissions
if (string.IsNullOrWhiteSpace(propertyBlock))
{
continue;
}
else
{
if (propertyBlock.Length == 10)
{
UnixFileType = propertyBlock[0].ToString();
Permission = propertyBlock.Substring(1);
}
counter++;
}
}
break;
case 2:
{
//number of hard links
if (string.IsNullOrWhiteSpace(propertyBlock))
{
continue;
}
else
{
NumberOfHardLinks = propertyBlock;
counter++;
}
}
break;
case 3:
{
//owner
if (string.IsNullOrWhiteSpace(propertyBlock))
{
continue;
}
else
{
Owner = propertyBlock;
counter++;
}
}
break;
case 4:
{
//group
if (string.IsNullOrWhiteSpace(propertyBlock))
{
continue;
}
else
{
Group = propertyBlock;
counter++;
}
}
break;
case 5:
{
//size
if (string.IsNullOrWhiteSpace(propertyBlock))
{
continue;
}
else
{
Size = propertyBlock;
counter++;
}
}
break;
case 6:
case 7:
case 8:
{
//last-modified date
if (string.IsNullOrWhiteSpace(propertyBlock))
{
continue;
}
else
{
LastModifiedDate += propertyBlock + " ";
counter++;
}
}
break;
case 9:
{
//file name
if (string.IsNullOrWhiteSpace(propertyBlock))
{
FileName += " ";
}
else
{
FileName += propertyBlock;
}
}
break;
}
}
LastModifiedDate = LastModifiedDate.Trim();
FileName = FileName.Trim();
}
}
版权声明:本文为qq_34739157原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。