FtpHelper实现ftp服务器文件读写操作(C#)
最近做了一个项目,需要读取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#)的更多相关文章
- FTP服务器搭建及操作(一)
FTP服务器搭建及操作(一) FTP搭建 PHP FTP操作 搭建方法参照(windows):http://www.cnblogs.com/lidan/archive/2012/06/04/25351 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- [转]Android - 文件读写操作 总结
转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...
- PHP文件读写操作之文件写入代码
在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...
- Java 字节流实现文件读写操作(InputStream-OutputStream)
Java 字节流实现文件读写操作(InputStream-OutputStream) 备注:字节流比字符流底层,但是效率底下. 字符流地址:http://pengyan5945.iteye.com/b ...
- Java 字符流实现文件读写操作(FileReader-FileWriter)
Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...
- python(三)一个文件读写操作的小程序
我们要实现一个文件读写操作的小程序 首先我们有一个文件 我们要以"============"为界限,每一个角色分割成一个独立的txt文件,按照分割线走的话是分成 xiaoNa_1. ...
- 实现动态的XML文件读写操作
实现动态的XML文件读写操作(依然带干货) 前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义 ...
- ios 简单的plist文件读写操作(Document和NSUserDefaults)
最近遇到ios上文件读写操作的有关知识,记录下来,以便以后查阅,同时分享与大家. 一,简单介绍一下常用的plist文件. 全名是:Property List,属性列表文件,它是一种用来存储串行化后的对 ...
随机推荐
- 保存eclipse个人配置的几种方式
本人用eclipse做Java开发之前,往往要设置下eclipse的背景,字体,颜色,以便保护眼睛.但这些数据是放在workspaces里的,一旦新建workspace所有要重新调整,很麻烦,于是尝试 ...
- eclipse调试远程tomcat
1.设置tomcat远程调试端口 catalina.sh export JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,susp ...
- c++中,如果访问数组越界,程序可能会意外终止(像死循环)
#include<iostream> using namespace std; ];// int main(){ vis[]=;//访问越界 ; } 程序错误表现:
- chrome console.log失效
把红框里的内容去掉就可以了 那个框是过滤..
- find a lover
#version_s#1.8#version_e# #update_s#https://files.cnblogs.com/files/dyh221/update_1.zip#update_e#
- win8 tiles风格标签插件jquery.wordbox.js
http://www.html580.com/12180 jquery.wordbox.js轻松实现win8瓦片tiles式风格标签插件,只需要调用JS就能轻松实现瓦片菜单,自定义菜单背景颜色,支持响 ...
- 关于cordova+vue打包apk文件无法访问数据接口
作为一个cordova小白,我按照官方文档和网上资料完成了讲vue文件打包到cordova中并打包成apk文件,完成了一个简单app的制作,当我正陶醉于可以自己完成一个app的时候突然发现,我的app ...
- django channle的使用
频道在PyPI上可用 - 要安装它,只需运行: 参照:https://channels.readthedocs.io/en/latest/introduction.html pip install ...
- cocos2dx-lua中handler解析
先看一段代码: local c=c or {} function c:onTouch() print "test in onTouch" end function handler( ...
- linux为什么要使用CentOS开发?
CentOS(Community Enterprise Operating System,社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源 ...