您的位置:首页 > 编程语言 > PHP开发

FTP文件下载(未能实现,请给点建议)

2011-03-24 12:00 141 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace FtpAndClientDemo
{
public class FtpDownloadUtil
{
#region
private const string LogFileName = "FtpLog.txt";

private string userName;//用户名
private string password;//密码

public FtpDownloadUtil()
{
userName = "hm";
password = "hm";
}

public FtpDownloadUtil(string uName, string pwd)
{
if (string.IsNullOrEmpty(uName) || string.IsNullOrEmpty(pwd))
{
userName = "Anonymous";
password = "";
}
else
{
userName = uName;
password = pwd;
}
}

private void recordLog(string exM)
{
File.AppendAllText(LogFileName, DateTime.Now.ToString() + "-------------------------------" + Environment.NewLine);
File.AppendAllText(LogFileName, exM);
}

/// <summary>
/// 用来获取请求
/// </summary>
/// <param name="ftpAdd">FTP服务器地址</param>
/// <returns></returns>
public FtpWebRequest CreateFtpConnect(string ftpAdd)
{
try
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpAdd));
ftpRequest.Credentials = new NetworkCredential(userName, password);
ftpRequest.UseBinary = true;

return ftpRequest;
}
catch (Exception ex)
{
recordLog(ex.Message);
return null;
}
}

private string[] GetFtpFileList(string ftpAdd, string wRMetod)
{
FtpWebRequest ftpRequest = CreateFtpConnect(ftpAdd);
if (ftpRequest != null)
{
StringBuilder fileListBuilder = new StringBuilder();
ftpRequest.Method = wRMetod;
ftpRequest.UseBinary = true;
//ftpRequest.KeepAlive = false;
try
{
WebResponse ftpResponse = ftpRequest.GetResponse();
StreamReader ftpFileListReader = new StreamReader(ftpResponse.GetResponseStream(), Encoding.UTF8);

string line = ftpFileListReader.ReadLine();

while (line != null)
{
fileListBuilder.Append(line);
fileListBuilder.Append("/n");
line = ftpFileListReader.ReadLine();

}

ftpFileListReader.Close();
ftpResponse.Close();
fileListBuilder.Remove(fileListBuilder.ToString().LastIndexOf('/n'), 1);
return fileListBuilder.ToString().Split('/n');
}
catch (Exception ex)
{
recordLog(ex.Message);
return null;
}
}
else
{
return null;
}
}

/// <summary>
/// 实现下载一个指定FTP目录下所有的文件和文件夹
/// </summary>
/// <param name="ftpAdd"></param>
/// <param name="localDir"></param>
/// <returns></returns>
public bool DownloadDirectory(string ftpAddress, string dirName, string localDir)
{
String[] fileList = null;
string downloadDir = string.Empty;
if (dirName != string.Empty)
{
//fileList = GetFtpFileList(ftpAddress + dirName + "/", WebRequestMethods.Ftp.ListDirectoryDetails);
//downloadDir = localDir + dirName;
fileList = GetFtpFileList(ftpAddress + "/", WebRequestMethods.Ftp.ListDirectoryDetails);
downloadDir = localDir;

if (!Directory.Exists(downloadDir))
{
Directory.CreateDirectory(downloadDir);
}
}
else
{
return false;
}

List<string> directory = new List<string>();
string[] temp = null;
//string[] files = GetFtpFileList(ftpAddress + dirName + "/", WebRequestMethods.Ftp.ListDirectory);
string[] files = GetFtpFileList(ftpAddress + "/", WebRequestMethods.Ftp.ListDirectory);

if (fileList != null)
{
foreach (string file in fileList)
{
if (file.Contains("<DIR>")) //if this is a dir need recursion download
{
temp = file.Trim().Split(new string[] { "<DIR>" }, StringSplitOptions.None);
directory.Add(temp[1].Trim());
temp = null;
}
}
}
else
{
return false;
}

if (directory.Count > 0 && directory.Count < fileList.Length)
{
foreach (string fi in files)
{
if (!directory.Contains(fi.Trim()))
{
this.DownloadDirectory(ftpAddress + "/" + fi.Trim(), fi.Trim(), downloadDir);
}
}
}
else if (directory.Count == 0 && fileList.Length > 0)
{
foreach (string fi in files)
{
this.DownloadDirectory(ftpAddress + "/" + fi.Trim(), fi.Trim(), downloadDir);
}
}

if (directory.Count > 0)
{
foreach (string dir in directory)
{
DownloadDirectory(ftpAddress + "/", dir, downloadDir);
}
}
return true;
}

public bool DownloadFileFromFtp(string FtpAdd, string fileName, string localDir)
{
return true;
}
#endregion

#region
/// </summary>
/// <param name="ftpads">FTP地址路径</param>
/// <param name="name">我们所选择的文件或者文件夹名字</param>
/// <param name="type">要发送到FTP服务器的命令</param>
/// <returns></returns>
public string[] ftp(string ftpads, string name, string type)
{
WebResponse webresp = null;
StreamReader ftpFileListReader = null;
FtpWebRequest ftpRequest = null;
try
{
ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpads + name));
ftpRequest.Credentials = new NetworkCredential("hm", "hm");
//ftpRequest.KeepAlive = false;

ftpRequest.Method = type;
webresp = ftpRequest.GetResponse();
ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);
}
catch (Exception ex)
{
ex.ToString();

}
StringBuilder str = new StringBuilder();
string line = ftpFileListReader.ReadLine();
while (line != null)
{
str.Append(line);
str.Append("/n");
line = ftpFileListReader.ReadLine();
}
string[] fen = str.ToString().Split('/n');
return fen;
}

/// <summary>
/// 单个文件下载方法
/// </summary>
/// <param name="adss">保存文件的本地路径</param>
/// <param name="ftpadss">下载文件的FTP路径</param>
public void download(string adss, string ftpadss)
{
//FileMode常数确定如何打开或创建文件,指定操作系统应创建新文件。
//FileMode.Create如果文件已存在,它将被改写
FileStream outputStream = new FileStream(adss, FileMode.Create);
FtpWebRequest downRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpadss));
downRequest.Credentials = new NetworkCredential("hm", "hm");

//设置要发送到 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();
}

/// <summary>
/// 下载方法KO
/// </summary>
/// <param name="ftpads">FTP路径</param>
/// <param name="name">需要下载文件路径</param>
/// <param name="Myads">保存的本地路径</param>
public void downftp(string ftpads, string name, string Myads)
{
string downloadDir = Myads + name;
string ftpdir = ftpads + name;
string[] fullname = ftp(ftpads, name, WebRequestMethods.Ftp.ListDirectoryDetails);
//判断是否为单个文件
if (fullname.Length <= 2)
{
if (fullname[fullname.Length - 1] == "")
{
download(downloadDir + "/" + name, ftpads + name + "/" + name);
}
}
else
{
string[] onlyname = ftp(ftpads, name, WebRequestMethods.Ftp.ListDirectory);
if (!Directory.Exists(downloadDir))
{
Directory.CreateDirectory(downloadDir);
}
foreach (string names in fullname)
{
//判断是否具有文件夹标识<DIR>
if (names.Contains("<DIR>"))
{
string olname = names.Split(new string[] { "<DIR>" },
StringSplitOptions.None)[1].Trim();
downftp(ftpdir, "//" + olname, downloadDir);
}
else
{
foreach (string onlynames in onlyname)
{
if (onlynames == "" || onlynames == " " || names == "")
{
break;
}
else
{
if (names.Contains(" " + onlynames))
{
download(downloadDir + "/" + onlynames, ftpads + name + "/" +
onlynames);
break;
}
}
}
}
}
}
}
#endregion
}
}

调用:

try
{
FtpDownloadUtil fptDownLoad = new FtpDownloadUtil("用户名", "密码");

bool b = fptDownLoad.DownloadDirectory("FTP地址", "/", "本地存放路径");
if (b)
{
MessageBox.Show("下载成功");
}
else
{
MessageBox.Show("失败了……");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: