FTP被动连接测试工具
/// <summary>
/// FTP帮助类
/// </summary>
public class FTPHelper
{
#region 字段
string ftpURI;
string ftpUserID;
string ftpServerIP;
string ftpPassword;
string ftpRemotePath;
#endregion
/// <summary>
/// 连接FTP服务器
/// </summary>
/// <param name="FtpServerIP">FTP连接地址</param>
/// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
/// <param name="FtpUserID">用户名</param>
/// <param name="FtpPassword">密码</param>
public FTPHelper(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword)
{
ftpServerIP = FtpServerIP;
ftpRemotePath = FtpRemotePath;
ftpUserID = FtpUserID;
ftpPassword = FtpPassword;
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
}
/// <summary>
/// 上传
/// </summary>
public void Upload(string filename)
{
FileInfo fileInf = new FileInfo(filename);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileInf.Name));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.KeepAlive = false;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
try
{
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 下载
/// </summary>
public void Download(string filePath, string fileName)
{
try
{
FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
FtpWebResponse response = (FtpWebResponse)reqFTP.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);
}
}
/// <summary>
/// 删除文件
/// </summary>
public void Delete(string fileName)
{
try
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
reqFTP.KeepAlive = false;
string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取当前目录下明细(包含文件和文件夹)
/// </summary>
public string[] GetFilesDetailList()
{
try
{
StringBuilder result = new StringBuilder();
FtpWebRequest ftp;
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = ftp.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
line = reader.ReadLine();
line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取FTP文件列表(包括文件夹)
/// </summary>
private string[] GetAllList(string url)
{
List<string> list = new List<string>();
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(url));
req.Credentials = new NetworkCredential(ftpPassword, ftpPassword);
req.Method = WebRequestMethods.Ftp.ListDirectory;
req.UseBinary = true;
req.UsePassive = true;
try
{
using (FtpWebResponse res = (FtpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
string s;
while ((s = sr.ReadLine()) != null)
{
list.Add(s);
}
}
}
}
catch (Exception ex)
{
throw (ex);
}
return list.ToArray();
}
/// <summary>
/// 获取当前目录下文件列表(不包括文件夹)
/// </summary>
public string[] GetFileList(string url)
{
StringBuilder result = new StringBuilder();
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpPassword, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
if (line.IndexOf("<DIR>") == -1)
{
result.Append(Regex.Match(line, @"[\S]+ [\S]+", RegexOptions.IgnoreCase).Value.Split(' ')[1]);
result.Append("\n");
}
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
}
catch (Exception ex)
{
throw (ex);
}
return result.ToString().Split('\n');
}
/// <summary>
/// 判断当前目录下指定的文件是否存在
/// </summary>
/// <param name="RemoteFileName">远程文件名</param>
public bool FileExist(string RemoteFileName)
{
string[] fileList = GetFileList("*.*");
foreach (string str in fileList)
{
if (str.Trim() == RemoteFileName.Trim())
{
return true;
}
}
return false;
}
/// <summary>
/// 创建文件夹
/// </summary>
public void MakeDir(string dirName)
{
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ }
}
/// <summary>
/// 获取指定文件大小
/// </summary>
public long GetFileSize(string filename)
{
FtpWebRequest reqFTP;
long fileSize = 0;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
fileSize = response.ContentLength;
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ }
return fileSize;
}
/// <summary>
/// 更改文件名
/// </summary>
public void ReName(string currentFilename, string newFilename)
{
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
reqFTP.Method = WebRequestMethods.Ftp.Rename;
reqFTP.RenameTo = newFilename;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ }
}
/// <summary>
/// 移动文件
/// </summary>
public void MovieFile(string currentFilename, string newDirectory)
{
ReName(currentFilename, newDirectory);
}
/// <summary>
/// 切换当前目录
/// </summary>
/// <param name="IsRoot">true:绝对路径 false:相对路径</param>
public void GotoDirectory(string DirectoryName, bool IsRoot)
{
if (IsRoot)
{
ftpRemotePath = DirectoryName;
}
else
{
ftpRemotePath += DirectoryName + "/";
}
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
}
}
using System;
using System.Collections.Generic;
using System.Web;
using System.IO;
using System.Text;
namespace FTPTestWds.LogHelpClassVer.V1
{
public class TxtLogHelper
{
/// <summary>
/// 写入日志到文本文件
/// </summary>
/// <param name="strMessage">日志内容</param>
public static void WriteTextLog(string strMessage)
{
string path = AppDomain.CurrentDomain.BaseDirectory + @"Log\";
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
DateTime time = DateTime.Now;
string fileFullPath = path + time.ToString("yyyy-MM-dd") + ".System.txt";
StringBuilder str = new StringBuilder();
str.Append("Time:" + time + ";Message: " + strMessage + "\r\n");
StreamWriter sw;
if (!File.Exists(fileFullPath))
{
sw = File.CreateText(fileFullPath);
}
else
{
sw = File.AppendText(fileFullPath);
}
sw.WriteLine(str.ToString());
sw.Close();
}
/// <summary>
/// 写入登录日志
/// </summary>
/// <param name="strMessage">日志内容</param>
public static void WriteLoginLog(string strMessage)
{
string path = AppDomain.CurrentDomain.BaseDirectory + @"Log\";
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
DateTime time = DateTime.Now;
string fileFullPath = path + "Global" + ".Login.txt";
StringBuilder str = new StringBuilder();
str.Append(strMessage);
StreamWriter sw;
if (File.Exists(fileFullPath))
{
File.Delete(fileFullPath);
}
sw = File.CreateText(fileFullPath);
sw.WriteLine(str.ToString());
sw.Close();
}
/// <summary>
/// 读取登录日志
/// </summary>
/// <param name="strMessage">日志内容</param>
public static string ReadLoginLog()
{
string path = AppDomain.CurrentDomain.BaseDirectory + @"Log\";
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
DateTime time = DateTime.Now;
string fileFullPath = path + "Global" + ".Login.txt";
if (File.Exists(fileFullPath))
{
return File.ReadAllText(fileFullPath);
}
return "";
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using FTPTestWds.LogHelpClassVer.V1;
using FTPTestWds.FtpHelpClassVer.V1;
namespace FTPTestWds
{
public partial class MainFrm : Form
{
public MainFrm()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
private void MainFrm_Load(object sender, EventArgs e)
{
#region V2版本
var ftp = new FtpHelpClassVer.V2.FTPHelper();
ftp.Connect("10.134.226.135", "ftpuser", "123654", 1021, "ftp");
//var aaa = ftp.GetFileList();
//var message = ftp.FtpDownloadFile("TEST_R_20190118133511338.txt", "/home/ftpdevuser/Source/DBX1/", out outMessage);
#endregion
#region V3版本
var ftpV3 = new FtpHelpClassVer.V3.FtpHelper();
ftpV3.RemoteHost = "10.134.226.135";
ftpV3.RemotePort = 1021;
ftpV3.RemoteUser = "ftpuser";
ftpV3.RemotePass = "123654";
ftpV3.RemotePath = "/Test";
ftpV3.Connect();
//ftpV3.Get("1.txt","/Test", "D:\\");
//var message = ftp.FtpDownloadFile("TEST_R_20190118133511338.txt", "/home/ftpdevuser/Source/DBX1/", out outMessage);
var ftpV3_1 = new FtpHelpClassVer.V3.Ftp("10.134.226.135:1021", "ftpuser", "123654", true);
var a = ftpV3_1.GetFileList("/Test/1.txt");
#endregion
#region 加载登录账号
var loginLog = TxtLogHelper.ReadLoginLog();
var loginArr = loginLog.Split('|');
if (loginArr.Length > 3)
{
this.txtIPPort.Text = loginArr[0];
this.txtRootDirectory.Text = loginArr[1];
this.txtUser.Text = loginArr[2];
this.txtPassword.Text = loginArr[3];
}
#endregion
}
private void MainFrm_FormClosed(object sender, FormClosedEventArgs e)
{
}
private void SingleConnect_Click(object sender, EventArgs e)
{
try
{
var testt = new FTPHelper(txtIPPort.Text.Trim(), txtRootDirectory.Text.Trim(), txtUser.Text.Trim(), txtPassword.Text.Trim());
var result = testt.GetFilesDetailList();
var shoWmessage = "连接正常:" + DateTime.Now.ToString();
TextAdd(shoWmessage);
foreach (var item in result)
{
TextAdd(item);
}
MessageBox.Show(shoWmessage);
}
catch (Exception ex)
{
//监控到端连的时候记录讯息到记事本
var exMessage = "连接异常:" + ex.Message;
TxtLogHelper.WriteTextLog(exMessage);
LbLog.Text += exMessage;
}
}
private void TextAddPool(string message)
{
TextAdd(message);
//ThreadPool.QueueUserWorkItem(new WaitCallback(TextAdd), message);
}
private void TextAdd(object message)
{
if (LbLog.Text.Length > 1000)
{
LbLog.Text = "";
}
LbLog.Text = message.ToString().Trim() + "\r\n" + LbLog.Text;
}
Thread t;
private void KeepConnect_Click(object sender, EventArgs e)
{
//this.btnSaveLogin.Enabled = false;
//this.SingleConnect.Enabled = false;
this.btnKeepConnect.Enabled = false;
#region MyRegion
t = new Thread(new ThreadStart(this.KeepConnect));
t.Start();
#endregion
}
private void KeepConnect()
{
try
{
//记录启动成功,按天记录记事本
var initMessage = "测试连接:无异常表示连接成功";
LbLog.Text += initMessage;
TxtLogHelper.WriteTextLog(initMessage);
while (true)
{
try
{
var testt = new FTPHelper(txtIPPort.Text.Trim(), txtRootDirectory.Text.Trim(), txtUser.Text.Trim(), txtPassword.Text.Trim());
var result = testt.GetFilesDetailList();
TextAddPool("连接成功:" + DateTime.Now.ToString());
}
catch (Exception ex)
{
//监控到端连的时候记录讯息到记事本
var exMessage = "连接异常:" + ex.Message;
TxtLogHelper.WriteTextLog(exMessage);
TextAddPool(exMessage);
}
if (nudInterval.Value <= 0)
{
nudInterval.Value = 1;
}
Thread.Sleep(Convert.ToInt32(nudInterval.Value) * 1000);
}
}
catch (Exception ex)
{
var exMessage = "异常错误:" + ex.Message;
TxtLogHelper.WriteTextLog(exMessage);
//TextAddPool(exMessage);
//MessageBox.Show(exMessage);
}
}
private void btnSaveLogin_Click(object sender, EventArgs e)
{
TxtLogHelper.WriteLoginLog(txtIPPort.Text.Trim() + "|" + txtRootDirectory.Text.Trim() + "|" + txtUser.Text.Trim() + "|" + txtPassword.Text.Trim());
MessageBox.Show("保存成功");
}
private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
{
TxtLogHelper.WriteTextLog("测试关闭");
if (t != null)
{
try
{
t.Abort();
}
catch (Exception)
{
}
}
}
}
}