You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
560 lines
18 KiB
560 lines
18 KiB
4 years ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Text;
|
||
|
using System.Net;
|
||
|
using System.IO;
|
||
|
|
||
|
public class FTPHelper
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// FTP请求对象
|
||
|
/// </summary>
|
||
|
FtpWebRequest request = null;
|
||
|
/// <summary>
|
||
|
/// FTP响应对象
|
||
|
/// </summary>
|
||
|
FtpWebResponse response = null;
|
||
|
/// <summary>
|
||
|
/// FTP服务器地址
|
||
|
/// </summary>
|
||
|
public string ftpURI { get; private set; }
|
||
|
/// <summary>
|
||
|
/// FTP服务器IP
|
||
|
/// </summary>
|
||
|
public string ftpServerIP { get; private set; }
|
||
|
/// <summary>
|
||
|
/// FTP服务器默认目录
|
||
|
/// </summary>
|
||
|
public string ftpRemotePath { get; private set; }
|
||
|
/// <summary>
|
||
|
/// FTP服务器登录用户名
|
||
|
/// </summary>
|
||
|
public string ftpUserID { get; private set; }
|
||
|
/// <summary>
|
||
|
/// FTP服务器登录密码
|
||
|
/// </summary>
|
||
|
public string ftpPassword { get; private set; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// 初始化
|
||
|
/// </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)
|
||
|
{
|
||
|
this.ftpServerIP = ftpServerIP;
|
||
|
this.ftpRemotePath = ftpRemotePath;
|
||
|
this.ftpUserID = ftpUserID;
|
||
|
this.ftpPassword = ftpPassword;
|
||
|
this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
|
||
|
}
|
||
|
~FTPHelper()
|
||
|
{
|
||
|
if (response != null)
|
||
|
{
|
||
|
response.Close();
|
||
|
response = null;
|
||
|
}
|
||
|
if (request != null)
|
||
|
{
|
||
|
request.Abort();
|
||
|
request = null;
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 建立FTP链接,返回响应对象
|
||
|
/// </summary>
|
||
|
/// <param name="uri">FTP地址</param>
|
||
|
/// <param name="ftpMethod">操作命令</param>
|
||
|
/// <returns></returns>
|
||
|
private FtpWebResponse Open(Uri uri, string ftpMethod)
|
||
|
{
|
||
|
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri);
|
||
|
request.Method = ftpMethod;
|
||
|
request.UseBinary = true;
|
||
|
request.KeepAlive = false;
|
||
|
request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
|
||
|
return (FtpWebResponse)request.GetResponse();
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 建立FTP链接,返回请求对象
|
||
|
/// </summary>
|
||
|
/// <param name="uri">FTP地址</param>
|
||
|
/// <param name="ftpMethod">操作命令</param>
|
||
|
private FtpWebRequest OpenRequest(Uri uri, string ftpMethod)
|
||
|
{
|
||
|
request = (FtpWebRequest)WebRequest.Create(uri);
|
||
|
request.Method = ftpMethod;
|
||
|
request.UseBinary = true;
|
||
|
request.KeepAlive = false;
|
||
|
request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
|
||
|
return request;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 创建目录
|
||
|
/// </summary>
|
||
|
/// <param name="remoteDirectoryName">目录名</param>
|
||
|
public void CreateDirectory(string remoteDirectoryName)
|
||
|
{
|
||
|
response = Open(new Uri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 更改目录或文件名
|
||
|
/// </summary>
|
||
|
/// <param name="currentName">当前名称</param>
|
||
|
/// <param name="newName">修改后新名称</param>
|
||
|
public void ReName(string currentName, string newName)
|
||
|
{
|
||
|
request = OpenRequest(new Uri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);
|
||
|
request.RenameTo = newName;
|
||
|
response = (FtpWebResponse)request.GetResponse();
|
||
|
}
|
||
|
/// <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 + "/";
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 删除目录(包括下面所有子目录和子文件)
|
||
|
/// </summary>
|
||
|
/// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param>
|
||
|
/*
|
||
|
* 例:删除test目录
|
||
|
FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");
|
||
|
helper.RemoveDirectory("web/test");
|
||
|
*/
|
||
|
public void RemoveDirectory(string remoteDirectoryName)
|
||
|
{
|
||
|
GotoDirectory(remoteDirectoryName, true);
|
||
|
var listAll = ListFilesAndDirectories();
|
||
|
foreach (var m in listAll)
|
||
|
{
|
||
|
if (m.IsDirectory)
|
||
|
RemoveDirectory(m.Path);
|
||
|
else
|
||
|
DeleteFile(m.Name);
|
||
|
}
|
||
|
GotoDirectory(remoteDirectoryName, true);
|
||
|
response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 文件上传
|
||
|
/// </summary>
|
||
|
/// <param name="localFilePath">本地文件路径</param>
|
||
|
public void Upload(string localFilePath)
|
||
|
{
|
||
|
FileInfo fileInf = new FileInfo(localFilePath);
|
||
|
request = OpenRequest(new Uri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile);
|
||
|
request.ContentLength = fileInf.Length;
|
||
|
int buffLength = 2048;
|
||
|
byte[] buff = new byte[buffLength];
|
||
|
int contentLen;
|
||
|
using (var fs = fileInf.OpenRead())
|
||
|
{
|
||
|
using (var strm = request.GetRequestStream())
|
||
|
{
|
||
|
contentLen = fs.Read(buff, 0, buffLength);
|
||
|
while (contentLen != 0)
|
||
|
{
|
||
|
strm.Write(buff, 0, contentLen);
|
||
|
contentLen = fs.Read(buff, 0, buffLength);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 删除文件
|
||
|
/// </summary>
|
||
|
/// <param name="remoteFileName">要删除的文件名</param>
|
||
|
public void DeleteFile(string remoteFileName)
|
||
|
{
|
||
|
response = Open(new Uri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取当前目录的文件和一级子目录信息
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public List<FileStruct> ListFilesAndDirectories()
|
||
|
{
|
||
|
var fileList = new List<FileStruct>();
|
||
|
response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails);
|
||
|
using (var stream = response.GetResponseStream())
|
||
|
{
|
||
|
using (var sr = new StreamReader(stream))
|
||
|
{
|
||
|
string line = null;
|
||
|
while ((line = sr.ReadLine()) != null)
|
||
|
{
|
||
|
//line的格式如下:
|
||
|
//08-18-13 11:05PM <DIR> aspnet_client
|
||
|
//09-22-13 11:39PM 2946 Default.aspx
|
||
|
try
|
||
|
{
|
||
|
DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy", null);
|
||
|
DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9));
|
||
|
string[] arrs = line.Split(' ');
|
||
|
var model = new FileStruct()
|
||
|
{
|
||
|
IsDirectory = line.IndexOf("<DIR>") > 0 ? true : false,
|
||
|
CreateTime = dtDateTime,
|
||
|
Name = arrs[arrs.Length - 1],
|
||
|
Path = ftpRemotePath + "/" + arrs[arrs.Length - 1]
|
||
|
};
|
||
|
fileList.Add(model);
|
||
|
}
|
||
|
catch (Exception)
|
||
|
{
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return fileList;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取当前目录的文件和一级子目录信息
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public List<FileStruct> GetLoadListFiles(string toDir)
|
||
|
{
|
||
|
var fileList = new List<FileStruct>();
|
||
|
var returnFileList = new List<FileStruct>();
|
||
|
using (FtpWebResponse response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectory))
|
||
|
{
|
||
|
using (var stream = response.GetResponseStream())
|
||
|
{
|
||
|
using (var sr = new StreamReader(stream))
|
||
|
{
|
||
|
string line = null;
|
||
|
while ((line = sr.ReadLine()) != null)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
if (line.ToUpper().IndexOf(".CSV") < 0)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
var model = new FileStruct()
|
||
|
{
|
||
|
Name = line,
|
||
|
Path = ftpURI + line
|
||
|
};
|
||
|
if (!Directory.Exists(toDir))
|
||
|
{
|
||
|
Directory.CreateDirectory(toDir);
|
||
|
}
|
||
|
|
||
|
fileList.Add(model);
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
AutoFileCopyNet.LogFileAccess.WriteLogFile("海天网络共享文件抓取失败,获取文件名失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//foreach (FileStruct item in fileList)//因为获取时间不准确,只比较文件大小。
|
||
|
//{
|
||
|
// using (response = Open(new Uri(item.Path), WebRequestMethods.Ftp.GetDateTimestamp))
|
||
|
// {
|
||
|
// try
|
||
|
// {
|
||
|
// item.UpdateTime = response.LastModified;
|
||
|
// }
|
||
|
// catch (Exception ex)
|
||
|
// {
|
||
|
// AutoFileCopyNet.LogFileAccess.WriteLogFile("海天数据文件获取UPDATETIME失败:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
||
|
// }
|
||
|
// }
|
||
|
//}
|
||
|
foreach (FileStruct item in fileList)
|
||
|
{
|
||
|
|
||
|
if (File.Exists(toDir + item.Name))//如果文件存在判断与源文件大小比较
|
||
|
{
|
||
|
FileInfo fInfo = new FileInfo(toDir + item.Name);
|
||
|
|
||
|
using (response = Open(new Uri(item.Path), WebRequestMethods.Ftp.GetFileSize))
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
if (fInfo.Length < response.ContentLength)
|
||
|
{
|
||
|
//if (Convert.ToDateTime(item.UpdateTime) == DateTime.MinValue)
|
||
|
//{
|
||
|
item.UpdateTime = DateTime.Now;
|
||
|
//}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
AutoFileCopyNet.LogFileAccess.WriteLogFile("海天数据文件获取UPDATETIME失败:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//if (Convert.ToDateTime(item.UpdateTime) == DateTime.MinValue)
|
||
|
//{
|
||
|
item.UpdateTime = DateTime.Now;
|
||
|
//}
|
||
|
}
|
||
|
using (FileStream outputStream = new FileStream(toDir + item.Name, FileMode.Create))
|
||
|
{
|
||
|
using (response = Open(new Uri(item.Path), WebRequestMethods.Ftp.DownloadFile))
|
||
|
{
|
||
|
using (Stream ftpStream = response.GetResponseStream())
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
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);
|
||
|
}
|
||
|
returnFileList.Add(item);
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
AutoFileCopyNet.LogFileAccess.WriteLogFile("海天数据文件拷贝失败:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
return returnFileList;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
|
||
|
/// 获取当前目录下文件列表(仅文件)
|
||
|
|
||
|
/// </summary>
|
||
|
|
||
|
/// <returns></returns>
|
||
|
|
||
|
public string[] GetFileList(string mask)
|
||
|
{
|
||
|
|
||
|
string[] downloadFiles;
|
||
|
|
||
|
StringBuilder result = new StringBuilder();
|
||
|
|
||
|
FtpWebRequest reqFTP;
|
||
|
|
||
|
try
|
||
|
{
|
||
|
|
||
|
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
|
||
|
|
||
|
reqFTP.UseBinary = true;
|
||
|
|
||
|
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
|
||
|
|
||
|
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
|
||
|
|
||
|
WebResponse response = reqFTP.GetResponse();
|
||
|
|
||
|
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
|
||
|
|
||
|
|
||
|
|
||
|
string line = reader.ReadLine();
|
||
|
|
||
|
while (line != null)
|
||
|
{
|
||
|
|
||
|
if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
|
||
|
{
|
||
|
|
||
|
|
||
|
|
||
|
string mask_ = mask.Substring(0, mask.IndexOf("*"));
|
||
|
|
||
|
if (line.Substring(0, mask_.Length) == mask_)
|
||
|
{
|
||
|
|
||
|
result.Append(line);
|
||
|
|
||
|
result.Append("\n");
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
else
|
||
|
{
|
||
|
|
||
|
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)
|
||
|
{
|
||
|
|
||
|
downloadFiles = null;
|
||
|
|
||
|
if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
|
||
|
{
|
||
|
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
return downloadFiles;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 列出当前目录的所有文件
|
||
|
/// </summary>
|
||
|
public List<FileStruct> ListFiles()
|
||
|
{
|
||
|
var listAll = ListFilesAndDirectories();
|
||
|
var listFile = listAll.Where(m => m.IsDirectory == false).ToList();
|
||
|
return listFile;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 列出当前目录的所有一级子目录
|
||
|
/// </summary>
|
||
|
public List<FileStruct> ListDirectories()
|
||
|
{
|
||
|
var listAll = ListFilesAndDirectories();
|
||
|
var listFile = listAll.Where(m => m.IsDirectory == true).ToList();
|
||
|
return listFile;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 判断当前目录下指定的子目录或文件是否存在
|
||
|
/// </summary>
|
||
|
/// <param name="remoteName">指定的目录或文件名</param>
|
||
|
public bool IsExist(string remoteName)
|
||
|
{
|
||
|
var list = ListFilesAndDirectories();
|
||
|
if (list.Count(m => m.Name == remoteName) > 0)
|
||
|
return true;
|
||
|
return false;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 判断当前目录下指定的一级子目录是否存在
|
||
|
/// </summary>
|
||
|
/// <param name="RemoteDirectoryName">指定的目录名</param>
|
||
|
public bool IsDirectoryExist(string remoteDirectoryName)
|
||
|
{
|
||
|
var listDir = ListDirectories();
|
||
|
if (listDir.Count(m => m.Name == remoteDirectoryName) > 0)
|
||
|
return true;
|
||
|
return false;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 判断当前目录下指定的子文件是否存在
|
||
|
/// </summary>
|
||
|
/// <param name="RemoteFileName">远程文件名</param>
|
||
|
public bool IsFileExist(string remoteFileName)
|
||
|
{
|
||
|
var listFile = ListFiles();
|
||
|
if (listFile.Count(m => m.Name == remoteFileName) > 0)
|
||
|
return true;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 下载
|
||
|
/// </summary>
|
||
|
/// <param name="saveFilePath">下载后的保存路径</param>
|
||
|
/// <param name="downloadFileName">要下载的文件名</param>
|
||
|
public void Download(string saveFilePath, string downloadFileName)
|
||
|
{
|
||
|
using (FileStream outputStream = new FileStream(saveFilePath + "\\" + downloadFileName, FileMode.Create))
|
||
|
{
|
||
|
response = Open(new Uri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile);
|
||
|
using (Stream ftpStream = response.GetResponseStream())
|
||
|
{
|
||
|
DateTime dtModify = response.LastModified;
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
public class FileStruct
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 是否为目录
|
||
|
/// </summary>
|
||
|
public bool IsDirectory { get; set; }
|
||
|
/// <summary>
|
||
|
/// 创建时间
|
||
|
/// </summary>
|
||
|
public DateTime CreateTime { get; set; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// 修改时间
|
||
|
/// </summary>
|
||
|
public DateTime UpdateTime { get; set; }
|
||
|
/// <summary>
|
||
|
/// 文件或目录名称
|
||
|
/// </summary>
|
||
|
public string Name { get; set; }
|
||
|
/// <summary>
|
||
|
/// 路径
|
||
|
/// </summary>
|
||
|
public string Path { get; set; }
|
||
|
}
|