zoukankan      html  css  js  c++  java
  • 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("
    ");
                         line = reader.ReadLine();
                     }
    
                     result.Remove(result.ToString().LastIndexOf('
    '), 1);
                     reader.Close();
                     response.Close();
                     return result.ToString().Split('
    ');
                 }
                 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;
             }
         
         }
     }
    

      

  • 相关阅读:
    MVC、MVP、MVVM架构模式
    JavaScript中的跨域详解(二)
    JavaScript中的跨域详解(一)
    RESTful基础知识
    Date类
    数据的相对比较
    递归应用
    浏览器在一次 HTTP 请求中,需要传输一个 4097 字节的文本数据给服务端,可以采用那些方式?
    【04】图解JSON
    【08】css sprite是什么,有什么优缺点
  • 原文地址:https://www.cnblogs.com/xuzimian/p/6648695.html
Copyright © 2011-2022 走看看