FtpHelper实现ftp服务器文件读写操作(C#)
发布时间 - 2026-01-11 00:27:20 点击率:次最近做了一个项目,需要读取ftp服务器上的文件,于是参考了网上提供的一些帮组方法,使用过程中,出现一些小细节问题,于是本人做了一些修改,拿来分享一下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Threading;
using System.Configuration;
namespace FtpSyn
{
public class FtpHelper
{
//基本设置 ftp://400:ZOina2017@192.168.10.17/400backup
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密码
//获取ftp上面的文件和文件夹
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.writeErrorLog("获取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)
{
LogHelper.writeErrorLog("获取ftp文件并读取内容失败:" + ex.Message);
return null;
}
}
/// <summary>
/// 获取文件大小
/// </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 void 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("上传文件成功");
}
}
}
catch (Exception ex)
{
Console.WriteLine("上传文件失败错误为" + ex.Message);
}
finally
{
}
}
catch (Exception ex)
{
Console.WriteLine("上传文件失败错误为" + ex.Message);
}
finally
{
}
}
catch (Exception ex)
{
Console.WriteLine("上传文件失败错误为" + ex.Message);
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">服务器下的相对路径 包括文件名</param>
public static void 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();
}
catch (Exception ex)
{
Console.WriteLine("删除文件出错:" + ex.Message);
}
}
/// <summary>
/// 新建目录 上一级必须先存在
/// </summary>
/// <param name="dirName">服务器下的相对路径</param>
public static void 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();
}
catch (Exception ex)
{
Console.WriteLine("创建目录出错:" + ex.Message);
}
}
/// <summary>
/// 删除目录 上一级必须先存在
/// </summary>
/// <param name="dirName">服务器下的相对路径</param>
public static void 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();
}
catch (Exception ex)
{
Console.WriteLine("删除目录出错:" + ex.Message);
}
}
/// <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;
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# FtpHelper
# ftp
# 文件读写
# C#如何控制IIS动态添加删除网站详解
# C#部署数据库及IIS站点
# IIS下调用证书出现异常的解决方法 (C#)
# C# WebService发布以及IIS发布
# C#实现获取IIS站点及虚拟目录信息的方法
# C#开发windows服务实现自动从FTP服务器下载文件
# C# FTP
# GetResponse()
# 远程服务器返回错误
# c# 在windows中操作IIS设置FTP服务器的示例
# 上传文件
# 器上
# 多个
# 这句
# 必须先
# 并将
# 文件列表
# 转换成
# 连接到
# 人做
# 大家多多
# 过程中
# 文件上传
# 默认为
# 上传
# 完成后
# 网上
# Credentials
# NetworkCredential
# true
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
音响网站制作视频教程,隆霸音响官方网站?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
百度浏览器如何管理插件 百度浏览器插件管理方法
如何在香港免费服务器上快速搭建网站?
Laravel如何实现本地化和多语言支持?(i18n教程)
JavaScript如何实现路由_前端路由原理是什么
Firefox Developer Edition开发者版本入口
奇安信“盘古石”团队突破 iOS 26.1 提权
如何快速搭建高效香港服务器网站?
实例解析Array和String方法
进行网站优化必须要坚持的四大原则
如何用虚拟主机快速搭建网站?详细步骤解析
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何在宝塔面板创建新站点?
如何在香港服务器上快速搭建免备案网站?
JavaScript模板引擎Template.js使用详解
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何在阿里云高效完成企业建站全流程?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel如何实现数据库事务?(DB Facade示例)
UC浏览器如何设置启动页 UC浏览器启动页设置方法
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
如何在IIS中新建站点并解决端口绑定冲突?
Laravel如何处理文件下载请求?(Response示例)
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
如何基于PHP生成高效IDC网络公司建站源码?
如何在腾讯云服务器上快速搭建个人网站?
Python文件操作最佳实践_稳定性说明【指导】
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
三星、SK海力士获美批准:可向中国出口芯片制造设备
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何在服务器上三步完成建站并提升流量?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何确保西部建站助手FTP传输的安全性?
如何在Windows环境下新建FTP站点并设置权限?
如何挑选优质建站一级代理提升网站排名?
如何用狗爹虚拟主机快速搭建网站?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】

