【转载】.NET 2.0下简单的FTP访问程序

简介: .NET 2.0下简单的FTP访问程序[简介] 也许大家也不想总依赖着第三方FTP软件,值得高兴的是,本文将给你开发出一套免费的来。尽管,本文中的代码没有设计成可重用性很高的库,不过确实是一个简单的可以重复使用部分代码的程序。

.NET 2.0下简单的FTP访问程序

FTP源代码


[简介]

也许大家也不想总依赖着第三方FTP软件,值得高兴的是,本文将给你开发出一套免费的来。尽管,本文中的代码没有设计成可重用性很高的库,不过确实是一个简单的可以重复使用部分代码的程序。本文最大的目的是演示如何在.NET 2.0中使用C#设计FTP访问程序。

[代码使用]

添加以下命名空间:

Code:
using System.Net;
using System.IO;


下面的步骤可以看成,使用 FtpWebRequest对象发送FTP请求的一般步骤:

1. 创建一个带有ftp服务器Uri的FtpWebRequest对象
2. 设置FTP的执行模式(上传、下载等)
3. 设置ftp webrequest选项(支持ssl,作为binary传输等)
4. 设置登陆帐号
5. 执行请求
6. 接收响应流(如果需要的话)
7. 关闭FTP请求,并关闭任何已经打开的数据流


首先,创建一个uri,它包括ftp地址、文件名(目录结构),这个uri将被用于创建 FtpWebRequest 实例。

设置 FtpWebRequest 对象的属性,这些属性决定ftp请求的设置。一些重用的属性如下:

Credentials :用户名、密码
KeepAlive :是否在执行完请求之后,就关闭。默认,设置为true
UseBinary :传输文件的数据格式Binary 还是ASCII。
UsePassive :主动还是被动模式,早期的ftp,主动模式下,客户端会正常工作;不过,如今,大部分端口都已经被封掉了,导致主动模式会失败。
Contentlength :这个值经常被忽略,不过如果你设置的话,还是对服务器有帮助的,至少让它事先知道用户期望的文件是多大。
Method :决定本次请求的动作(upload, download, filelist 等等)

上传文件

private   void  Upload( string  filename)
{
  FileInfo fileInf 
=   new  FileInfo(filename);
  
string  uri  =   " ftp:// "   +  ftpServerIP  +   " / "   +  fileInf.Name;
  FtpWebRequest reqFTP;
   
  
//  Create FtpWebRequest object from the Uri provided
  reqFTP  =  (FtpWebRequest)FtpWebRequest.Create( new  Uri(
            
" ftp:// "   +  ftpServerIP  +   " / "   +  fileInf.Name));

  
//  Provide the WebPermission Credintials
  reqFTP.Credentials  =   new  NetworkCredential(ftpUserID,
                                             ftpPassword);
   
  
//  By default KeepAlive is true, where the control connection is
  
//  not closed after a command is executed.
  reqFTP.KeepAlive  =   false ;

  
//  Specify the command to be executed.
  reqFTP.Method  =  WebRequestMethods.Ftp.UploadFile;
   
  
//  Specify the data transfer type.
  reqFTP.UseBinary  =   true ;

  
//  Notify the server about the size of the uploaded file
  reqFTP.ContentLength  =  fileInf.Length;

  
//  The buffer size is set to 2kb
   int  buffLength  =   2048 ;
  
byte [] buff  =   new   byte [buffLength];
  
int  contentLen;
   
  
//  Opens a file stream (System.IO.FileStream) to read
  the file to be uploaded
  FileStream fs 
=  fileInf.OpenRead();
   
  
try
  {
        
//  Stream to which the file to be upload is written
        Stream strm  =  reqFTP.GetRequestStream();
       
        
//  Read from the file stream 2kb at a time
        contentLen  =  fs.Read(buff,  0 , buffLength);
       
        
//  Till Stream content ends
         while  (contentLen  !=   0 )
        {
            
//  Write Content from the file stream to the
            
//  FTP Upload Stream
            strm.Write(buff,  0 , contentLen);
            contentLen 
=  fs.Read(buff,  0 , buffLength);
        }
       
        
//  Close the file stream and the Request Stream
        strm.Close();
        fs.Close();
  }
  
catch (Exception ex)
    {
        MessageBox.Show(ex.Message, 
" Upload Error " );
    }
}


上面的代码用于 上传文件,设置FtpWebRequest 到ftp服务器上指定的文件,并设置其它属性。打开本地文件,把其内容写入FTP请求数据流。

下载文件

private   void  Download( string  filePath,  string  fileName)
{
    FtpWebRequest reqFTP;
    
try
    {
        
// filePath = <<The full path where the
        
// file is to be created. the>>,
        
// fileName = <<Name of the file to be createdNeed not
        
// name on FTP server. name name()>>
        FileStream outputStream  =   new  FileStream(filePath  +
                                
" \\ "   +  fileName, FileMode.Create);

        reqFTP 
=  (FtpWebRequest)FtpWebRequest.Create( new  Uri( " ftp:// "   +
                                ftpServerIP 
+   " / "   +  fileName));
        reqFTP.Method 
=  WebRequestMethods.Ftp.DownloadFile;
        reqFTP.UseBinary 
=   true ;
        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);
        
while  (readCount  >   0 )
        {
            outputStream.Write(buffer, 
0 , readCount);
            readCount 
=  ftpStream.Read(buffer,  0 , bufferSize);
        }

        ftpStream.Close();
        outputStream.Close();
        response.Close();
    }
    
catch  (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


上面是从FTP 下载文件的示例代码,与上传不一样,这里需要一个响应数据流(response stream),它包括文件请求的内容。使用FtpWebRequest 类中的 GetResponse() 函数得到数据。

获取文件列表

public   string [] GetFileList()
{
    
string [] downloadFiles;
    StringBuilder result 
=   new  StringBuilder();
    FtpWebRequest reqFTP;
    
try
    {
        reqFTP 
=  (FtpWebRequest)FtpWebRequest.Create( new  Uri(
                  
" ftp:// "   +  ftpServerIP  +   " / " ));
        reqFTP.UseBinary 
=   true ;
        reqFTP.Credentials 
=   new  NetworkCredential(ftpUserID,
                                                   ftpPassword);
        reqFTP.Method 
=  WebRequestMethods.Ftp.ListDirectory;
        WebResponse response 
=  reqFTP.GetResponse();
        StreamReader reader 
=   new  StreamReader(response
                                        .GetResponseStream());
       
        
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;
    }
}


上面是得到ftp服务器上的指定路径下的文件列表,Uri被指定为Ftp服务器名称、端口以及目录结构。

对于FTP服务器上文件的 重命名删除获取文件大小文件详细信息创建目录等等操作于上面类似,你很容易地理解本文中的代码。
目录
相关文章
|
21天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
74 13
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
49 2
|
2月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务
|
2月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
122 0
|
3月前
|
Ubuntu 持续交付 API
如何使用 dotnet pack 打包 .NET 跨平台程序集?
`dotnet pack` 是 .NET Core 的 NuGet 包打包工具,用于将代码打包成 NuGet 包。通过命令 `dotnet pack` 可生成 `.nupkg` 文件。使用 `--include-symbols` 和 `--include-source` 选项可分别创建包含调试符号和源文件的包。默认情况下,`dotnet pack` 会先构建项目,可通过 `--no-build` 跳过构建。此外,还可以使用 `--output` 指定输出目录、`-c` 设置配置等。示例展示了创建类库项目并打包的过程。更多详情及命令选项,请参考官方文档。
249 11
|
3月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
359 6
|
3月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
3月前
|
自然语言处理 C# 图形学
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
|
4月前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
4月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)