331 lines
13 KiB
C#
331 lines
13 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Net;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Threading;
|
|||
|
|
using Models;
|
|||
|
|
using Microsoft.AspNetCore.Http;
|
|||
|
|
|
|||
|
|
namespace COMMON
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// ftp 帮助类
|
|||
|
|
/// </summary>
|
|||
|
|
public static class FtpHelper
|
|||
|
|
{
|
|||
|
|
//基本设置
|
|||
|
|
static private string path => ConfigEntity.Instance.FTPPATH; //目标路径
|
|||
|
|
static private string ftpip => ConfigEntity.Instance.FTPIP; //ftp IP地址
|
|||
|
|
static private string username => ConfigEntity.Instance.FTPUSERNAME; //ftp用户名
|
|||
|
|
static private string password => ConfigEntity.Instance.FTPPASSWORD; //ftp密码
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取ftp上面的文件和文件夹
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="dir"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static string[] GetFileList(string dir)
|
|||
|
|
{
|
|||
|
|
StringBuilder result = new StringBuilder();
|
|||
|
|
FtpWebRequest request;
|
|||
|
|
|
|||
|
|
request = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpip + Path.Combine(path, dir)));
|
|||
|
|
request.UseBinary = true;
|
|||
|
|
request.Credentials = new NetworkCredential(username, password);//设置用户名和密码
|
|||
|
|
request.Method = WebRequestMethods.Ftp.ListDirectory;
|
|||
|
|
request.UseBinary = true;
|
|||
|
|
|
|||
|
|
WebResponse response = request.GetResponse();
|
|||
|
|
StreamReader reader = new StreamReader(response.GetResponseStream());
|
|||
|
|
|
|||
|
|
string line = reader.ReadLine();
|
|||
|
|
while (line != null)
|
|||
|
|
{
|
|||
|
|
result.Append(line);
|
|||
|
|
result.Append("\n");
|
|||
|
|
line = reader.ReadLine();
|
|||
|
|
}
|
|||
|
|
// to remove the trailing '\n'
|
|||
|
|
result.Remove(result.ToString().LastIndexOf('\n'), 1);
|
|||
|
|
reader.Close();
|
|||
|
|
response.Close();
|
|||
|
|
return result.ToString().Split('\n');
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取文件大小
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="file">ip服务器下的相对路径</param>
|
|||
|
|
/// <returns>文件大小</returns>
|
|||
|
|
public static int GetFileSize(string file)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
StringBuilder result = new StringBuilder();
|
|||
|
|
FtpWebRequest request;
|
|||
|
|
|
|||
|
|
string URL = ftpip + path +file.Replace("\\", "/");
|
|||
|
|
request = (FtpWebRequest)FtpWebRequest.Create(new Uri(URL));
|
|||
|
|
request.UseBinary = true;
|
|||
|
|
request.Credentials = new NetworkCredential(username, password);//设置用户名和密码
|
|||
|
|
request.Method = WebRequestMethods.Ftp.GetFileSize;
|
|||
|
|
|
|||
|
|
int dataLength = (int)request.GetResponse().ContentLength;
|
|||
|
|
|
|||
|
|
return dataLength;
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 文件上传
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param>
|
|||
|
|
/// <param name="fs">目标文件夹:服务器下的相对路径 不填为根目录</param>
|
|||
|
|
/// <param name="newname">目标文件夹:服务器下的相对路径 不填为根目录</param>
|
|||
|
|
public static bool FileUpLoad(FileStream fs, string newname, string objPath = "")
|
|||
|
|
{
|
|||
|
|
string url = ftpip + path;
|
|||
|
|
if (objPath != "")
|
|||
|
|
url += objPath + "/";
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
FtpWebRequest reqFTP = null;
|
|||
|
|
//待上传的文件 (全路径)
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
using (fs)
|
|||
|
|
{
|
|||
|
|
long length = fs.Length;
|
|||
|
|
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + newname));
|
|||
|
|
|
|||
|
|
//设置连接到FTP的帐号密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
//设置请求完成后是否保持连接
|
|||
|
|
reqFTP.KeepAlive = false;
|
|||
|
|
//指定执行命令
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
|
|||
|
|
//指定数据传输类型
|
|||
|
|
reqFTP.UseBinary = true;
|
|||
|
|
|
|||
|
|
using (Stream stream = reqFTP.GetRequestStream())
|
|||
|
|
{
|
|||
|
|
//设置缓冲大小
|
|||
|
|
int BufferLength = 5120;
|
|||
|
|
byte[] b = new byte[BufferLength];
|
|||
|
|
int i;
|
|||
|
|
while ((i = fs.Read(b, 0, BufferLength)) > 0)
|
|||
|
|
{
|
|||
|
|
stream.Write(b, 0, i);
|
|||
|
|
}
|
|||
|
|
Console.WriteLine("上传文件成功");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Console.WriteLine("上传文件失败错误为" + ex.Message);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
Console.WriteLine("上传文件失败错误为" + ex.Message);
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 文件上传
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="filePath">原路径(绝对路径)包括文件名</param>
|
|||
|
|
/// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param>
|
|||
|
|
/// <param name="newname">目标文件夹:服务器下的相对路径 不填为根目录</param>
|
|||
|
|
public static bool FileUpLoad(string filePath,string newname, string objPath = "")
|
|||
|
|
{
|
|||
|
|
string url = ftpip + path;
|
|||
|
|
if (objPath != "")
|
|||
|
|
url += objPath + "/";
|
|||
|
|
|
|||
|
|
FtpWebRequest reqFTP = null;
|
|||
|
|
//待上传的文件 (全路径)
|
|||
|
|
|
|||
|
|
FileInfo fileInfo = new FileInfo(filePath);
|
|||
|
|
using (FileStream fs = fileInfo.OpenRead())
|
|||
|
|
{
|
|||
|
|
long length = fs.Length;
|
|||
|
|
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + newname));
|
|||
|
|
|
|||
|
|
//设置连接到FTP的帐号密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
//设置请求完成后是否保持连接
|
|||
|
|
reqFTP.KeepAlive = false;
|
|||
|
|
//指定执行命令
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
|
|||
|
|
//指定数据传输类型
|
|||
|
|
reqFTP.UseBinary = true;
|
|||
|
|
|
|||
|
|
using (Stream stream = reqFTP.GetRequestStream())
|
|||
|
|
{
|
|||
|
|
//设置缓冲大小
|
|||
|
|
int BufferLength = 5120;
|
|||
|
|
byte[] b = new byte[BufferLength];
|
|||
|
|
int i;
|
|||
|
|
while ((i = fs.Read(b, 0, BufferLength)) > 0)
|
|||
|
|
{
|
|||
|
|
stream.Write(b, 0, i);
|
|||
|
|
}
|
|||
|
|
Console.WriteLine("上传文件成功");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 删除文件
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="fileName">服务器下的相对路径 包括文件名</param>
|
|||
|
|
public static bool DeleteFileName(string fileName)
|
|||
|
|
{
|
|||
|
|
string URL = ftpip + path+ fileName.Replace("\\", "/");
|
|||
|
|
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(URL));
|
|||
|
|
// 指定数据传输类型
|
|||
|
|
reqFTP.UseBinary = true;
|
|||
|
|
// ftp用户名和密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
// 默认为true,连接不会被关闭
|
|||
|
|
// 在一个命令之后被执行
|
|||
|
|
reqFTP.KeepAlive = false;
|
|||
|
|
// 指定执行什么命令
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
|
|||
|
|
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
|
|||
|
|
response.Close();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 新建目录 上一级必须先存在
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="dirName">服务器下的相对路径</param>
|
|||
|
|
public static void MakeDir(string dirName)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpip +path+dirName));
|
|||
|
|
// 指定数据传输类型
|
|||
|
|
reqFTP.UseBinary = true;
|
|||
|
|
// ftp用户名和密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
|
|||
|
|
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
|
|||
|
|
response.Close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 删除目录 上一级必须先存在
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="dirName">服务器下的相对路径</param>
|
|||
|
|
public static void DelDir(string dirName)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpip + Path.Combine(path, dirName)));
|
|||
|
|
// ftp用户名和密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
|
|||
|
|
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
|
|||
|
|
response.Close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 从ftp服务器上获得文件夹列表
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="RequedstPath">服务器下的相对路径</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static List<string> GetDirctory(string RequedstPath)
|
|||
|
|
{
|
|||
|
|
List<string> strs = new List<string>();
|
|||
|
|
|
|||
|
|
|
|||
|
|
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpip + Path.Combine(path, RequedstPath)));
|
|||
|
|
// ftp用户名和密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
|
|||
|
|
WebResponse response = reqFTP.GetResponse();
|
|||
|
|
StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名
|
|||
|
|
|
|||
|
|
string line = reader.ReadLine();
|
|||
|
|
while (line != null)
|
|||
|
|
{
|
|||
|
|
if (line.Contains("<DIR>"))
|
|||
|
|
{
|
|||
|
|
string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim();
|
|||
|
|
strs.Add(msg);
|
|||
|
|
}
|
|||
|
|
line = reader.ReadLine();
|
|||
|
|
}
|
|||
|
|
reader.Close();
|
|||
|
|
response.Close();
|
|||
|
|
return strs;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 从ftp服务器上获得文件列表
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="RequedstPath">服务器下的相对路径</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static List<string> GetFile(string RequedstPath)
|
|||
|
|
{
|
|||
|
|
List<string> strs = new List<string>();
|
|||
|
|
|
|||
|
|
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpip + Path.Combine(path, RequedstPath)));
|
|||
|
|
// ftp用户名和密码
|
|||
|
|
reqFTP.Credentials = new NetworkCredential(username, password);
|
|||
|
|
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
|
|||
|
|
WebResponse response = reqFTP.GetResponse();
|
|||
|
|
StreamReader reader = new StreamReader(response.GetResponseStream());//中文文件名
|
|||
|
|
|
|||
|
|
string line = reader.ReadLine();
|
|||
|
|
while (line != null)
|
|||
|
|
{
|
|||
|
|
if (!line.Contains("<DIR>"))
|
|||
|
|
{
|
|||
|
|
string msg = line.Substring(39).Trim();
|
|||
|
|
strs.Add(msg);
|
|||
|
|
}
|
|||
|
|
line = reader.ReadLine();
|
|||
|
|
}
|
|||
|
|
reader.Close();
|
|||
|
|
response.Close();
|
|||
|
|
return strs;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|