在公司的生產環境中文件傳輸是必不可少的;對於要開發 一個FTP工具來說這是必需用到的技能;
以下代碼用於記錄;時間:2018-12-6 21:59:35
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Collections;
namespace FTPClass
{
public class FTP
{
#region 內部變量
private string serverhost;
private string serveruser;
private string serverpass;
#endregion
#region 構造函數
/// <summary>
/// 構造函數
/// </summary>
/// <param name="serverhost">FTP服務器IP地址</param>
/// <param name="serveruser">用戶名</param>
/// <param name="serverpass">密碼</param>
public FTP(string serverIP, string User, string Pass)
{
serverhost = serverIP;
serveruser = User;
serverpass = Pass;
}
#endregion
#region 方法
/// <summary>
/// 檢查服務器上是否存在某個文件
/// </summary>
/// <param name="RemoteFile">服務器上的某個文件</param>
/// <returns></returns>
/// <!--文件路徑要從根路徑開始-->
public bool FileExists(string RemoteFile)
{
string path=RemoteFile.Substring(0,RemoteFile.LastIndexOf("/")+1);
string file=RemoteFile.Substring(RemoteFile.LastIndexOf("/")+1,RemoteFile.Length-RemoteFile.LastIndexOf("/")-1);
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + path));
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
ftp.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = ftp.GetResponse() as FtpWebResponse;
StreamReader str = new StreamReader(response.GetResponseStream(), Encoding.Default, true);
string strline = string.Empty;
while ((strline = str.ReadLine()) != null)
{
if (strline == file)
{
str.Close();
response.Close();
return true;
}
}
str.Close();
response.Close();
}
catch (WebException we)
{
return false;
}
catch (Exception ex)
{
throw new Exception("查詢文件是否存在失敗,錯誤信息:" + ex.Message);
}
return false;
}
/// <summary>
/// 檢測某個路徑是否存在
/// </summary>
/// <param name="RemoteDir">服務器上的路徑</param>
/// <returns></returns>
public bool DirExists(string RemoteDir)
{
string foldername = "";
string str= RemoteDir.Substring(0, RemoteDir.LastIndexOf("/"));
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + str));
ftp.UseBinary = true;
ftp.UsePassive = true;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, System.Text.Encoding.Default);
if (reader != null)
{
foldername = reader.ReadToEnd();
}
response.Close();
stream.Close();
reader.Close();
if (foldername == "")
return false;
else
return true;
}
catch (WebException we)
{
return false;
}
catch (Exception ex)
{
throw new Exception("檢測路徑是否存在失敗,錯誤信息:" + ex.Message);
}
}
/// <summary>
/// 上傳文件
/// </summary>
/// <param name="LocalFile">本地文件</param>
/// <param name="RemoteFile">服務器上的文件</param>
public void UpLoadFile(string LocalFile, string RemoteFile)
{
FileInfo fi = new FileInfo(LocalFile);
FtpWebRequest ftp;
ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteFile));
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
ftp.Method = WebRequestMethods.Ftp.UploadFile;
ftp.ContentLength = fi.Length;
int BufLength = 2048;
byte[] buff = new byte[BufLength];
int ConntLength;
FileStream fs = fi.OpenRead();
try
{
Stream strm = ftp.GetRequestStream();
ConntLength = fs.Read(buff, 0, BufLength);
while (ConntLength != 0)
{
strm.Write(buff, 0, ConntLength);
ConntLength = fs.Read(buff, 0, BufLength);
}
strm.Close();
}
catch (Exception ex)
{
throw new Exception("上傳文件失敗,錯誤信息:" + ex.Message);
}
finally
{
fs.Close();
}
}
/// <summary>
/// 上傳文件夾
/// </summary>
/// <param name="LocalDir">本地文件夾</param>
/// <param name="RemoteDir">服務器文件夾</param>
public void UpLoadFolder(string LocalDir, string RemoteDir)
{
string LocalPath;
string RemotePath;
if (Directory.Exists(LocalDir))
{
DirectoryInfo di = new DirectoryInfo(LocalDir);
FileInfo[] files = di.GetFiles();
if (files.Length > 0)
{
foreach(FileInfo file in files)
{
LocalPath = LocalDir + file;
RemotePath = RemoteDir + file;
if (!DirExists(RemoteDir))
{
MakeDir(RemoteDir);
}
UpLoadFile(LocalPath, RemotePath);
}
}
DirectoryInfo[] dirs = di.GetDirectories();
if (dirs.Length > 0)
{
foreach (DirectoryInfo dir in dirs)
{
LocalPath = LocalDir + dir + "//";
RemotePath = RemoteDir + dir + "/";
UpLoadFolder(LocalPath, RemotePath);
}
}
}
else
{
throw new Exception("上傳文件夾失敗,本地文件夾不存在");
}
}
public void DnLoadFile(string RemoteFile, string LocalFile)
{
FtpWebRequest ftp;
try
{
FileStream outputStream = new FileStream(LocalFile, FileMode.Create);
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteFile));
ftp.Method = WebRequestMethods.Ftp.DownloadFile;
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
FtpWebResponse response = (FtpWebResponse)ftp.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();
}
catch (Exception ex)
{
throw new Exception("下載文件失敗,錯誤信息:" + ex.Message);
}
}
public void DnLoadFolder(string RemoteDir, string LocalDir)
{
ArrayList files = new ArrayList();
try
{
files=ListFiles(RemoteDir);
foreach (string file in files)
{
string RemoteFile=RemoteDir+file;
string LocalFile=LocalDir+file;
DnLoadFile(RemoteFile, LocalFile);
}
}
catch (Exception ex)
{
throw new Exception("下載文件夾失敗,錯誤信息:" + ex.Source + "," + ex.Message);
}
}
public void DeleteFile(string RemoteFile)
{
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteFile));
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Method = WebRequestMethods.Ftp.DeleteFile;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
throw new Exception("刪除文件失敗,錯誤信息:" + ex.Message);
}
}
public void DeleteDir(string RemoteDir)
{
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteDir));
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
throw new Exception("刪除文件夾失敗,錯誤信息:" + ex.Message);
}
}
public void MakeDir(string RemoteDir)
{
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteDir));
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
throw new Exception("創建文件夾失敗,錯誤信息:" + ex.Message);
}
}
public ArrayList ListFiles(string RemoteDir)
{
ArrayList Files = new ArrayList();
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + serverhost + "/" + RemoteDir));
ftp.UseBinary = true;
ftp.KeepAlive = false;
ftp.Credentials = new NetworkCredential(serveruser, serverpass);
ftp.Method = WebRequestMethods.Ftp.ListDirectory;
WebResponse response = ftp.GetResponse();
StreamReader str = new StreamReader(response.GetResponseStream(), Encoding.Default, true);
string strline = string.Empty;
while ((strline = str.ReadLine()) != null)
{
Files.Add(strline);
}
str.Close();
response.Close();
}
catch (WebException we)
{
return Files;
}
catch (Exception ex)
{
throw new Exception("列舉文件失敗,錯誤信息:" + ex.Source + "," + ex.Message);
}
return Files;
}
#endregion
}
}