C# FTP 服务器文件操作工具类

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Net;
using System.Text;

// 基本设置
//static private string path = @"ftp://" + ConfigurationManager.AppSettings["FtpServerIP"].ToString() + "/";     // 目标路径
//static private string ftpip = ConfigurationManager.AppSettings["FtpServerIP"].ToString();                               // ftp IP地址
//static private string username = ConfigurationManager.AppSettings["FtpUserName"].ToString();                   // ftp用户名
//static private string password = ConfigurationManager.AppSettings["FtpPassWord"].ToString();                    // ftp密码

static private string ftpip = "192.168.0.1:8080";		// ftp IP地址
static private string path = $"ftp://{ftpip}/";			// 目标路径
static private string username = "admin";				// ftp 用户名
static private string password = "123456";				// ftp 密码


/// <summary>
/// 获取ftp上面的文件和文件夹
/// </summary>
/// <param name="dir"></param>
/// <returns></returns>
public static string[] GetFileList(string dir)
{
	string[] downloadFiles;
	StringBuilder result = new StringBuilder();
	FtpWebRequest request;
	try
	{
		request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + "/" + dir));
		request.UseBinary = true;
		request.Credentials = new NetworkCredential(username, password);//设置用户名和密码
        request.Method = WebRequestMethods.Ftp.ListDirectory;
        request.UseBinary = true;
        request.UsePassive = false; //选择主动还是被动模式 , 这句要加上的。
        request.KeepAlive = false;//一定要设置此属性,否则一次性下载多个文件的时候,会出现异常。
        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();
		}

		result.Remove(result.ToString().LastIndexOf('\n'), 1);
		reader.Close();
		response.Close();
		return result.ToString().Split('\n');
	}
	catch (Exception ex)
	{
		//LogHelper.LogWarning("获取ftp上面的文件和文件夹:" + ex.Message);
		Console.WriteLine("获取ftp上面的文件和文件夹:" + ex.Message);
		downloadFiles = null;
		return downloadFiles;
	}
}

/// <summary>
/// 从ftp服务器上获取文件并将内容全部转换成string返回
/// </summary>
/// <param name="fileName"></param>
/// <param name="dir"></param>
/// <returns></returns>
public static string GetFileStr(string fileName, string dir)
{
	FtpWebRequest reqFTP;
	try
	{
		reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + dir + "/" + fileName));
		reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
		reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(username, password);
        reqFTP.UsePassive = false; //选择主动还是被动模式 , 这句要加上的。
        reqFTP.KeepAlive = false;//一定要设置此属性,否则一次性下载多个文件的时候,会出现异常。
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream ftpStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(ftpStream);
        string fileStr = reader.ReadToEnd();

        reader.Close();
        ftpStream.Close();
        response.Close();
        return fileStr;
	}
	catch (Exception ex)
	{
		Console.WriteLine("获取ftp文件并读取内容失败:" + ex.Message);
		return null;
	}
}

/// <summary>
/// 获取文件大小
/// 文件名填写格式 (文件名.扩展名 img.jpg)
/// </summary>
/// <param name="file">ip服务器下的相对路径</param>
/// <returns>文件大小</returns>
public static int GetFileSize(string file)
{
	StringBuilder result = new StringBuilder();
	FtpWebRequest request;
	try
	{
		request = (FtpWebRequest)FtpWebRequest.Create(new Uri(path + "/" + file));
		request.UseBinary = true;
		request.Credentials = new NetworkCredential(username, password);//设置用户名和密码
		request.Method = WebRequestMethods.Ftp.GetFileSize;
		int dataLength = (int)request.GetResponse().ContentLength;
		return dataLength;
	}
	catch (Exception ex)
	{
		Console.WriteLine("获取文件大小出错:" + ex.Message);
		return -1;
	}
}

/// <summary>
/// 文件上传
/// </summary>
/// <param name="filePath">原路径(绝对路径)包括文件名</param>
/// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param>
public static bool FileUpLoad(string filePath, string objPath = "")
{
	try
	{
		string url = path;
		if (objPath != "")
			url += objPath + "/";
		try
		{
			FtpWebRequest reqFTP = null;
			//待上传的文件 (全路径)
			try
			{
				FileInfo fileInfo = new FileInfo(filePath);
				using (FileStream fs = fileInfo.OpenRead())
				{
					long length = fs.Length;
					reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + fileInfo.Name));
					//设置连接到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;
                     }
                }
			}
            catch (Exception ex)
            {
				Console.WriteLine("上传文件失败错误为" + ex.Message);
                return false;
            }
            finally
            {

            }
		}
        catch (Exception ex)
        {
			Console.WriteLine("上传文件失败错误为" + ex.Message);
            return false;
        }
        finally
        {

        }
	}
    catch (Exception ex)
    {
		Console.WriteLine("上传文件失败错误为" + ex.Message);
		return false;
	}
}

/// <summary>
/// 文件上传 (传入文件对象)
/// </summary>
/// <param name="files">上传的文件 (需转换为byte数组)</param>
/// <param name="objPath">目标文件夹:服务器下的相对路径 不填为根目录</param>
public static bool FileUpLoad(byte[] files, string fileName, string objPath = "")
{
	MemoryStream memoryStream = new MemoryStream(files, 0, files.Length);             // 读入MemoryStream对象
	memoryStream.Write(files, 0, files.Length);
	try
    {
		string url = path;
        if (objPath != "")
			url += objPath;
        try
        {
			FtpWebRequest reqFTP = null;
            //待上传的文件 (全路径)
            try
            {
				using (MemoryStream fs = memoryStream)
                {
					long length = fs.Length;
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + fileName));
                    
                    //设置连接到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;
                        fs.Position = 0;
                        while ((i = fs.Read(b, 0, BufferLength)) > 0)
                        {
                        	stream.Write(b, 0, i);
                        }
                        Console.WriteLine("上传文件成功");
                        return true;
                    }
                }
            }
            catch (Exception ex)
            {
            	Console.WriteLine("上传文件失败错误为" + ex.Message);
                return false;
            }
            finally
            {

            }
		}
        catch (Exception ex)
        {
			Console.WriteLine("上传文件失败错误为" + ex.Message);
			return false;
		}
        finally
        {

        }
    }
    catch (Exception ex)
    {
		Console.WriteLine("上传文件失败错误为" + ex.Message);
		return false;
	}
}

/// <summary>
/// 删除文件夹   (仅支持删除包含文件的文件夹,删除包含文件夹的文件夹会报错)
/// </summary>
/// <param name="pathName">服务器下的相对路径</param>
public static bool DeleteFolder(string pathName)
{
	try
    {
		string uri = path + "/" + pathName;
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // 指定数据传输类型
        reqFTP.UseBinary = true;
        // ftp用户名和密码
        reqFTP.Credentials = new NetworkCredential(username, password);
        // 默认为true,连接不会被关闭
        // 在一个命令之后被执行
        reqFTP.KeepAlive = false;
        // 指定执行什么命令
        reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        response.Close();
        return true;
	}
    catch (Exception ex)
    {
		Console.WriteLine("删除文件夹出错:" + ex.Message);
        return false;
	}
}

/// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">服务器下的相对路径 包括文件名</param>
public static bool DeleteFileName(string fileName)
{
	try
	{
		FileInfo fileInf = new FileInfo(ftpip + "/" + fileName);
        string uri = path + fileName;
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // 指定数据传输类型
        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;
     }
     catch (Exception ex)
     {
		Console.WriteLine("删除文件出错:" + ex.Message);
        return false;
     }
}

/// <summary>
/// 新建目录    (上一级目录必须先存在)
/// </summary>
/// <param name="dirName">服务器下的相对路径</param>
public static bool MakeDir(string dirName)
{
	try
	{
		string uri = path + dirName;
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // 指定数据传输类型
        reqFTP.UseBinary = true;
        // ftp用户名和密码
        reqFTP.Credentials = new NetworkCredential(username, password);
        reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        response.Close();
        return true;
    }
    catch (Exception ex)
    {
		Console.WriteLine("创建目录出错:" + ex.Message);
        return false;
	}
}

/// <summary>
/// 删除目录    (上一级目录必须先存在)
/// </summary>
/// <param name="dirName">服务器下的相对路径</param>
public static bool DelDir(string dirName)
{
	try
	{
		string uri = path + dirName;
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // ftp用户名和密码
        reqFTP.Credentials = new NetworkCredential(username, password);
        reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        response.Close();
        return true;
    }
    catch (Exception ex)
    {
		Console.WriteLine("删除目录出错:" + ex.Message);
        return false;
	}
}

/// <summary>
/// 从ftp服务器上获得文件夹列表
/// </summary>
/// <param name="RequedstPath">服务器下的相对路径</param>
/// <returns></returns>
public static List<string> GetDirctory(string RequedstPath)
{
	List<string> strs = new List<string>();
	try
	{
		string uri = path + RequedstPath;  //目标路径 path为服务器地址
        FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // 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;
	}
    catch (Exception ex)
    {
		Console.WriteLine("获取目录出错:" + ex.Message);
    }
    return strs;
}

/// <summary>
/// 从ftp服务器上获得文件列表
/// </summary>
/// <param name="RequedstPath">服务器下的相对路径</param>
/// <returns></returns>
public static List<string> GetFile(string RequedstPath)
{
	List<string> strs = new List<string>();
	try
	{
		string uri = path + RequedstPath;  //目标路径 path为服务器地址
		FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
        // 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;
	}
    catch (Exception ex)
    {
		Console.WriteLine("获取文件出错:" + ex.Message);
	}
	return strs;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血码农ZL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值