using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Collections;
namespace FtpTest
{
class DownloadFolder
{
#region 单个文件下载
/// <summary>
/// 单个文件下载方法
/// </summary>
/// <param name="adss">保存文件的本地路径</param>
/// <param name="remotePaths">下载文件的FTP路径</param>
public static void download(string adss, string remotePaths)
{
//FileMode常数确定如何打开或创建文件,指定操作系统应创建新文件。
//FileMode.Create如果文件已存在,它将被改写
FileStream outputStream = new FileStream(adss, FileMode.Create);
FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(remotePaths));
downRequest.UseBinary = true;
downRequest.Credentials = new NetworkCredential("zhang","zhang");
//设置要发送到 FTP 服务器的命令
downRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)downRequest.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
#endregion
#region 得到ftp服务器端指定文件夹下的目录
/// </summary>
/// <param name="remotePath">FTP地址路径</param>
/// <param name="name">我们所选择的文件或者文件夹名字</param>
/// <param name="type">要发送到FTP服务器的命令</param>
/// <returns></returns>
public static string[] ftp(string remotePath,string name,string type)
{
WebResponse webresp = null;
StreamReader ftpremoteFileListReader = null;
FtpWebRequest ftpRequest=null;
try
{
ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(remotePath +"/" + name));
ftpRequest.Method = type;
ftpRequest.Credentials = new NetworkCredential("zhang", "zhang");
webresp = ftpRequest.GetResponse();
ftpremoteFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.UTF8);
}
catch(Exception ex)
{
ex.ToString();
}
StringBuilder str = new StringBuilder();
string line=ftpremoteFileListReader.ReadLine();
while (line != null)
{
str.Append(line);
str.Append("\n");
line = ftpremoteFileListReader.ReadLine();
}
string[] fen = str.ToString().Split('\n');
return fen;
}
#endregion
#region 下载文件夹
/// <summary>
/// 下载方法
/// </summary>
/// <param name="remotePath">FTP路径</param>
/// <param name="name">需要下载文件路径</param>
/// <param name="localPath">保存的本地路径</param>
public static void downftp(string remotePath, string name, string localPath)
{
string downloadLocalPath = localPath + "/" + name;
string downloadRemotePath = remotePath + "/" + name;
string[] remoteDetails = ftp(remotePath, name, WebRequestMethods.Ftp.ListDirectoryDetails);
//判断是否为单个文件
if (remoteDetails.Length <= 2)
{
if (remoteDetails[remoteDetails.Length - 1] == "")
{
download(downloadLocalPath, downloadRemotePath);
}
}
else
{
string[] remoteFiles = ftp(remotePath, name, WebRequestMethods.Ftp.ListDirectory);
Hashtable remoteFileList = new Hashtable();
foreach (string fileName in remoteFiles)
{
if (fileName == "")
continue;
remoteFileList.Add(fileName, fileName);
}
DirectoryInfo d = new DirectoryInfo(downloadLocalPath);
if (!d.Exists)
{
d.Create();
}
foreach (string remoteFileOrFolder in remoteDetails)
{
if (remoteFileOrFolder == "")
continue;
string[] ss = remoteFileOrFolder.Split(' ');
List<string> info = new List<string>();
foreach (string a in ss)
{
if (a != "")
info.Add(a);
}
string shortName = info[info.Count - 1];
if (shortName == "." || shortName == "..")
continue;
//判断是否具有文件夹标识<DIR>
if (!isNotFolder(shortName, remoteFileList))
{
downftp(downloadRemotePath, shortName, downloadLocalPath);
}
else
{
download(downloadLocalPath + "/" + shortName, downloadRemotePath + "/" +
shortName);
}
}
}
Console.WriteLine("传输完毕");
}
#endregion
#region 判断fileName是一个文件
/// <summary>
/// 判断fileName是一个文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="table"></param>
/// <returns></returns>
public static bool isNotFolder(string fileName,Hashtable table)
{
bool flag = false;
foreach (DictionaryEntry each in table)
{
if(fileName == each.Value.ToString())
{
flag = true;
break;
}
}
return flag;
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Examples.System.Net;
using System.IO;
namespace FtpTest
{
class Program
{
public static bool DisplayFileFromServer(Uri serverUri)
{
// The serverUri parameter should start with the ftp:// scheme.
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return false;
}
// Get the object used to communicate with the server.
WebClient request = new WebClient();
// This example assumes the FTP site uses anonymous logon.
request.Credentials = new NetworkCredential("zhang", "zhang");
try
{
byte[] newFileData = request.DownloadData(serverUri.ToString());
string fileString = System.Text.Encoding.UTF8.GetString(newFileData);
Console.WriteLine(fileString);
}
catch (WebException e)
{
Console.WriteLine(e.ToString());
}
return true;
}
public static bool DeleteFileOnServer(Uri serverUri)
{
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return false;
}
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Credentials = new NetworkCredential("zhang","zhang");
request.Method = WebRequestMethods.Ftp.DeleteFile;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Delete State :{0}",response.StatusDescription);
response.Close();
return true;
}
#region 异步上传文件
/// <summary>
///
/// </summary>
/// <param name="localPath">本地文件路径如:@"D://zhang.txt"</param>
/// <param name="remotePath">服务器端路径:ftp://127.0.0.1/</param>
/// <param name="fileName">在服务器端的文件名</param>
/// <returns></returns>
public static bool AsynUploadFile(string localPath,string remotePath,string fileName)
{
return AsynchronousFtpUpLoader.AsynUploadFile(localPath, remotePath, fileName);
}
#endregion
#region 获取服务器端文件列表
/// <summary>
/// 获取服务器端文件列表
/// </summary>
/// <param name="serverUri">服务器端路径</param>
/// <param name="userName">用户名</param>
/// <param name="pass">密码</param>
/// <returns></returns>
public static string[] GetFileListFromServer(Uri serverUri, string userName, string pass)
{
if (serverUri.Scheme != Uri.UriSchemeFtp)
{
return null;
}
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.UseBinary = true;
request.Credentials = new NetworkCredential(userName,pass);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string line = reader.ReadLine();
StringBuilder result = new StringBuilder();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
Console.WriteLine(result);
//result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
#endregion
#region 下载文件夹
/// <summary>
/// 下载文件夹
/// </summary>
/// <param name="ftpads"></param>
/// <param name="name"></param>
/// <param name="Myads"></param>
public static void DownLoadFolder(string ftpads, string name, string Myads)
{
DownloadFolder.downftp(ftpads,name,Myads);
}
#endregion
static void Main(string[] args)
{
/*Uri uri = new Uri("ftp://127.0.0.1/zhang.txt");
//Program.DisplayFileFromServer(uri);
Program.DeleteFileOnServer(uri);
Console.ReadKey();*/
//Program.AsynUploadFile(@"D://zhang.txt","ftp://127.0.0.1","long.txt");
//Program.getFileListFromServer(new Uri("ftp://127.0.0.1/Test"),"zhang","zhang");
Program.DownLoadFolder("ftp://127.0.0.1", "", @"D://Test");
Console.ReadKey();
}
}
}
运行成功