当前位置: 首页 > news >正文

c#_实现FTP方法(一) --- FtpWebRequest

ExpandedBlockStart.gif 代码
class  FTP_Class
    {
        
string  ftpServerIP;
        
string  ftpUserID;
        
string  ftpPassword;
        FtpWebRequest reqFTP;

        
public   void  Connecttest( string  ftpServerIP,  string  ftpUserID,  string  ftpPassword)
        {
            
//  根据uri创建FtpWebRequest对象
            reqFTP  =  (FtpWebRequest)FtpWebRequest.Create( new  Uri( " ftp:// "   +  ftpServerIP));
            
//  指定数据传输类型
            reqFTP.UseBinary  =   true ;
            
//  ftp用户名和密码
            reqFTP.Credentials  =   new  NetworkCredential(ftpUserID, ftpPassword);
        }

        
#region  连接
        
///   <summary>
        
///  连接
        
///   </summary>
        
///   <param name="path"></param>
         private   void  Connect(String path) // 连接ftp
        {
            
//  根据uri创建FtpWebRequest对象
            reqFTP  =  (FtpWebRequest)FtpWebRequest.Create( new  Uri(path));
            
//  指定数据传输类型
            reqFTP.UseBinary  =   true ;
            
//  ftp用户名和密码
            reqFTP.Credentials  =   new  NetworkCredential(ftpUserID, ftpPassword);
        }
        
#endregion
       
        
#region  ftp登录信息
        
///   <summary>
        
///  ftp登录信息
        
///   </summary>
        
///   <param name="ftpServerIP"> ftpServerIP </param>
        
///   <param name="ftpUserID"> ftpUserID </param>
        
///   <param name="ftpPassword"> ftpPassword </param>
         public   void  FtpUpDown( string  ftpServerIP,  string  ftpUserID,  string  ftpPassword)
        {
            
this .ftpServerIP  =  ftpServerIP;
            
this .ftpUserID  =  ftpUserID;
            
this .ftpPassword  =  ftpPassword;
        }
        
#endregion
        
        
#region  获取文件列表
        
///   <summary>
        
///  获取文件列表
        
///   </summary>
        
///   <param name="path"></param>
        
///   <param name="WRMethods"></param>
        
///   <returns></returns>
         private   string [] GetFileList( string  path,  string  WRMethods) // 上面的代码示例了如何从ftp服务器上获得文件列表
        {
            
string [] downloadFiles;
            StringBuilder result 
=   new  StringBuilder();
            
try
            {
                Connect(path);
                reqFTP.Method 
=  WRMethods;
                WebResponse response 
=  reqFTP.GetResponse();
                StreamReader reader 
=   new  StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); // 中文文件名
                 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 ' );
            }
            
catch  (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
                downloadFiles 
=   null ;
                
return  downloadFiles;
            }
        }
        
public   string [] GetFileList( string  path) // 上面的代码示例了如何从ftp服务器上获得文件列表
        {
            
return  GetFileList( " ftp:// "   +  ftpServerIP  +   " / "   +  path, WebRequestMethods.Ftp.ListDirectory);
        }
        
public   string [] GetFileList() // 上面的代码示例了如何从ftp服务器上获得文件列表
        {
            
return  GetFileList( " ftp:// "   +  ftpServerIP  +   " / " , WebRequestMethods.Ftp.ListDirectory);
        }
        
#endregion               

        
#region  上传文件
        
///   <summary>
        
///  上传文件
        
///   </summary>
        
///   <param name="filename"></param>
         public   bool  Upload( string  filename,  string  path,  out   string  errorinfo)  // 上面的代码实现了从ftp服务器上载文件的功能
        {
            path 
=  path.Replace( " \\ " " / " );
            FileInfo fileInf 
=   new  FileInfo(filename);
            
string  uri  =   " ftp:// "   +  path  +   " / "   +  fileInf.Name;          
            Connect(uri);
// 连接         
            
//  默认为true,连接不会被关闭
            
//  在一个命令之后被执行
            reqFTP.KeepAlive  =   false ;
            
//  指定执行什么命令
            reqFTP.Method  =  WebRequestMethods.Ftp.UploadFile;           
            
//  上传文件时通知服务器文件的大小
            reqFTP.ContentLength  =  fileInf.Length;
            
//  缓冲大小设置为kb 
             int  buffLength  =   2048 ;
            
byte [] buff  =   new   byte [buffLength];
            
int  contentLen;
            
//  打开一个文件流(System.IO.FileStream) 去读上传的文件
            FileStream fs  =  fileInf.OpenRead();
            
try
            {
                
//  把上传的文件写入流
                Stream strm  =  reqFTP.GetRequestStream();
                
//  每次读文件流的kb
                contentLen  =  fs.Read(buff,  0 , buffLength);
                
//  流内容没有结束
                 while  (contentLen  !=   0 )
                {
                    
//  把内容从file stream 写入upload stream 
                    strm.Write(buff,  0 , contentLen);
                    contentLen 
=  fs.Read(buff,  0 , buffLength);
                }
                
//  关闭两个流
                strm.Close();
                fs.Close();
                errorinfo 
=   " 完成 " ;
                
return   true ;
            }
            
catch  (Exception ex)
            {
                errorinfo 
=   string .Format( " 因{0},无法完成上传 " , ex.Message);
                
return   false ;
            }
        }
        
#endregion        

        
#region  续传文件
        
///   <summary>
        
///  续传文件
        
///   </summary>
        
///   <param name="filename"></param>
         public   bool  Upload( string  filename,  long  size, string  path,  out   string  errorinfo)  // 上面的代码实现了从ftp服务器上载文件的功能
        {
            path 
=  path.Replace( " \\ " " / " );
            FileInfo fileInf 
=   new  FileInfo(filename);
            
// string uri = "ftp: // " + path + "/" + fileInf.Name;
             string  uri  =   " ftp:// "   +  path;
            Connect(uri);
// 连接         
            
//  默认为true,连接不会被关闭
            
//  在一个命令之后被执行
            reqFTP.KeepAlive  =   false ;
            
//  指定执行什么命令         
            reqFTP.Method  =  WebRequestMethods.Ftp.AppendFile;
            
//  上传文件时通知服务器文件的大小
            reqFTP.ContentLength  =  fileInf.Length;
            
//  缓冲大小设置为kb 
             int  buffLength  =   2048 ;
            
byte [] buff  =   new   byte [buffLength];
            
int  contentLen;
            
//  打开一个文件流(System.IO.FileStream) 去读上传的文件
            FileStream fs  =  fileInf.OpenRead();
            
try
            {
                StreamReader dsad 
=   new  StreamReader(fs);
                fs.Seek(size, SeekOrigin.Begin);
                
//  把上传的文件写入流
                Stream strm  =  reqFTP.GetRequestStream();
                
//  每次读文件流的kb
                contentLen  =  fs.Read(buff,  0 , buffLength);
                
//  流内容没有结束
                 while  (contentLen  !=   0 )
                {
                    
//  把内容从file stream 写入upload stream 
                    strm.Write(buff,  0 , contentLen);
                    contentLen 
=  fs.Read(buff,  0 , buffLength);
                }
                
//  关闭两个流
                strm.Close();
                fs.Close();
                errorinfo 
=   " 完成 " ;
                
return   true ;
            }
            
catch  (Exception ex)
            {
                errorinfo 
=   string .Format( " 因{0},无法完成上传 " , ex.Message);
                
return   false ;
            }
        }
        
#endregion

        
#region  下载文件
        
///   <summary>
        
///  下载文件
        
///   </summary>
        
///   <param name="filePath"></param>
        
///   <param name="fileName"></param>
        
///   <param name="errorinfo"></param>
        
///   <returns></returns>
         public   bool  Download( string  ftpfilepath,  string  filePath,  string  fileName,  out   string  errorinfo) /// /上面的代码实现了从ftp服务器下载文件的功能
        {
            
try
            {
                filePath 
=  filePath.Replace( " 我的电脑\\ " "" );
                String onlyFileName 
=  Path.GetFileName(fileName);
                
string  newFileName  =  filePath  +  onlyFileName;
                
if  (File.Exists(newFileName))
                {
                    errorinfo 
=   string .Format( " 本地文件{0}已存在,无法下载 " , newFileName);
                    
return   false ;
                }
                ftpfilepath 
=  ftpfilepath.Replace( " \\ " " / " );
                
string  url  =   " ftp:// "   +  ftpfilepath;
                Connect(url);
// 连接 
                reqFTP.Credentials  =   new  NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response 
=  (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream 
=  response.GetResponseStream();
                
long  cl  =  response.ContentLength;
                
int  bufferSize  =   2048 ;
                
int  readCount;
                
byte [] buffer  =   new   byte [bufferSize];
                readCount 
=  ftpStream.Read(buffer,  0 , bufferSize);
                FileStream outputStream 
=   new  FileStream(newFileName, FileMode.Create);
                
while  (readCount  >   0 )
                {
                    outputStream.Write(buffer, 
0 , readCount);
                    readCount 
=  ftpStream.Read(buffer,  0 , bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
                errorinfo 
=   "" ;
                
return   true ;
            }
            
catch  (Exception ex)
            {
                errorinfo 
=   string .Format( " 因{0},无法下载 " , ex.Message);
                
return   false ;
            }
        } 
        
#endregion

        
#region  删除文件
        
///   <summary>
        
///  删除文件
        
///   </summary>
        
///   <param name="fileName"></param>
         public   void  DeleteFileName( string  fileName)
        {
            
try
            {
                FileInfo fileInf 
=   new  FileInfo(fileName);
                
string  uri  =   " ftp:// "   +  ftpServerIP  +   " / "   +  fileInf.Name;
                Connect(uri);
// 连接         
                
//  默认为true,连接不会被关闭
                
//  在一个命令之后被执行
                reqFTP.KeepAlive  =   false ;
                
//  指定执行什么命令
                reqFTP.Method  =  WebRequestMethods.Ftp.DeleteFile;
                FtpWebResponse response 
=  (FtpWebResponse)reqFTP.GetResponse();
                response.Close();
            }
            
catch  (Exception ex)
            {
                
// MessageBox.Show(ex.Message, "删除错误");
            }
        }
        
#endregion

        
#region  在ftp上创建目录
        
///   <summary>
        
///  在ftp上创建目录
        
///   </summary>
        
///   <param name="dirName"></param>
         public   void  MakeDir( string  dirName)
        {
            
try
            {
                
string  uri  =   " ftp:// "   +  ftpServerIP  +   " / "   +  dirName;
                Connect(uri);
// 连接      
                reqFTP.Method  =  WebRequestMethods.Ftp.MakeDirectory;
                FtpWebResponse response 
=  (FtpWebResponse)reqFTP.GetResponse();
                response.Close();
            }
            
catch  (Exception ex)
            {
                
//  MessageBox.Show(ex.Message);
            }
        }
        
#endregion

        
#region  删除ftp上目录
        
///   <summary>
        
///  删除ftp上目录
        
///   </summary>
        
///   <param name="dirName"></param>
         public   void  delDir( string  dirName)
        {
            
try
            {
                
string  uri  =   " ftp:// "   +  ftpServerIP  +   " / "   +  dirName;
                Connect(uri);
// 连接      
                reqFTP.Method  =  WebRequestMethods.Ftp.RemoveDirectory;
                FtpWebResponse response 
=  (FtpWebResponse)reqFTP.GetResponse();
                response.Close();
            }
            
catch  (Exception ex)
            {
                
//  MessageBox.Show(ex.Message);
            }
        }
        
#endregion

        
#region  获得ftp上文件大小
        
///   <summary>
        
///  获得ftp上文件大小
        
///   </summary>
        
///   <param name="filename"></param>
        
///   <returns></returns>
         public   long  GetFileSize( string  filename)
        {
            
long  fileSize  =   0 ;
            filename 
=  filename.Replace( " \\ " , " / " );           
            
try
            {
               
//  FileInfo fileInf = new FileInfo(filename);
                
// string uri1 = "ftp: // " + ftpServerIP + "/" + fileInf.Name;
               
//  string uri = filename;
                 string  uri  =   " ftp:// "   +  filename;
                Connect(uri);
// 连接      
                reqFTP.Method  =  WebRequestMethods.Ftp.GetFileSize;
                FtpWebResponse response 
=  (FtpWebResponse)reqFTP.GetResponse();
                fileSize 
=  response.ContentLength;
                response.Close();
            }
            
catch  (Exception ex)
            {
                
//  MessageBox.Show(ex.Message);
            }
            
return  fileSize;
        }
        
#endregion

        
#region  ftp上文件改名
        
///   <summary>
        
///  ftp上文件改名
        
///   </summary>
        
///   <param name="currentFilename"></param>
        
///   <param name="newFilename"></param>
         public   void  Rename( string  currentFilename,  string  newFilename)
        {
            
try
            {
                FileInfo fileInf 
=   new  FileInfo(currentFilename);
                
string  uri  =   " ftp:// "   +  ftpServerIP  +   " / "   +  fileInf.Name;
                Connect(uri);
// 连接
                reqFTP.Method  =  WebRequestMethods.Ftp.Rename;
                reqFTP.RenameTo 
=  newFilename;
                FtpWebResponse response 
=  (FtpWebResponse)reqFTP.GetResponse();
                
// Stream ftpStream = response.GetResponseStream();
                
// ftpStream.Close();
                response.Close();
            }
            
catch  (Exception ex)
            {
                
//  MessageBox.Show(ex.Message);
            }
        }
        
#endregion

        
#region  获得文件明晰
        
///   <summary>
        
///  获得文件明晰
        
///   </summary>
        
///   <returns></returns>
         public   string [] GetFilesDetailList()
        {
            
return  GetFileList( " ftp:// "   +  ftpServerIP  +   " / " , WebRequestMethods.Ftp.ListDirectoryDetails);
        }
        
///   <summary>
        
///  获得文件明晰
        
///   </summary>
        
///   <param name="path"></param>
        
///   <returns></returns>
         public   string [] GetFilesDetailList( string  path)
        {
            path 
=  path.Replace( " \\ " " / " );
            
return  GetFileList( " ftp:// "   +  path, WebRequestMethods.Ftp.ListDirectoryDetails);
        }
        
#endregion
        
    }

 

转载于:https://www.cnblogs.com/zhangtao/archive/2010/11/13/2347584.html

相关文章:

  • 友善经典之作mini6410介绍
  • Linux集群和自动化维2.4.1 sed的基础语法格式
  • [周鸿祎] 与其苟且活着,不如奋起抗争
  • 机器人系统设计与制作:Python语言实现3.3 本章小结
  • VC6 ODBC 例子 之二
  • 【STM32 .Net MF开发板学习-21】蓝牙遥控智能小车(PC模式)
  • 《众妙之门——移动交互体验设计》一1.2 物物互联
  • jQuery Timers插件
  • 《嵌入式Linux基础教程(第2版)》——2.3 存储
  • 程序员的一天
  • 看反病毒专家对EICAR检测代码的专业解读
  • 写一个每秒接收 100 万数据包的程序究竟有多难?
  • PHP性能杂谈
  • ET工业大脑 将大规模落地江苏
  • 警惕一大波银行类木马正在靠近,新型BankBot木马解析
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Flannel解读
  • Golang-长连接-状态推送
  • js中的正则表达式入门
  • JS专题之继承
  • 阿里云前端周刊 - 第 26 期
  • 多线程事务回滚
  • 二维平面内的碰撞检测【一】
  • 深入浏览器事件循环的本质
  • 使用Gradle第一次构建Java程序
  • 思考 CSS 架构
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • Java总结 - String - 这篇请使劲喷我
  • puppet连载22:define用法
  • 数据库巡检项
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # include “ “ 和 # include < >两者的区别
  • #DBA杂记1
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (C#)一个最简单的链表类
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)springcloud实战之config配置中心
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (四)Controller接口控制器详解(三)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)UDP基本编程步骤
  • (转)Sql Server 保留几位小数的两种做法
  • .gitignore文件—git忽略文件
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET NPOI导出Excel详解
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法