惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
D
Docker
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
U
Unit 42
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Recent Announcements
Recent Announcements
GbyAI
GbyAI
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
L
LangChain Blog
A
About on SuperTechFans
M
MIT News - Artificial intelligence
B
Blog

博客园 - 唐朝程序员

推荐一个winform 界面交互类库转 DBCC SHOWCONTIG、DBCC DBREINDEX。 SQL Server2005索引碎片分析和解决方法 some things 微软自带的防反编译工具dotfuscator.exe的使用 在HttpModule中使用gzip,deflate协议对aspx页面进行压缩(转) SQL查询重复数据和清除重复数据 lucene 笔记 SqlServer的汉字转拼音码的函数 windows系统事件查询 2010考研冲刺必备 2010公务员考试必备资料 url重写适用html为伪静态后真实的html无法访问的解决方法 SQL的 优化 (某篇的精简版) SQL 优化 (某篇的精简版) U影资源网原域名被封了,现在叫狐库网,启用了新的域名 vs2008 下载地址以及正式版序列号 Windows XP和Office2003通过正版验证,免去黑屏之忧 NOKIA诺基亚PC套件在2003系统上的安装方法
在.net 2.0 中使用ftp
唐朝程序员 · 2008-11-26 · via 博客园 - 唐朝程序员

摘要:本文简单的介绍了在.net 2.0下使用ftp的几种简单的方法,并提供了一个对FtpWebRequest封装的Ftp操作类

在.net 1.1中,如果我们要使用ftp,往往得借助一些第三方类库,虽然这些第三方类库写得也非常好,但说明文档不够详细,以及一些使用习惯问题,往往没有.net自己的库使用地得心应手。现在好了,在.net 2.0 中添加了对许多ftp的支持,使用ftp变得非常简单了。

首先,WebClient支以已经开始支持ftp协议了。

比如说要从远程服务器上下载文件,只要使用两条命令就可以完成。

WebClient webClient = new WebClient();

webClient.DownloadFile("ftp://username:password@192.168.1.1/123.txt", @"f:\123.txt");

上传文件到远程服务器也是一样简单。

WebClient webClient = new WebClient();

webClient.UploadFile("ftp://username:password@192.168.1.1/456.txt", @"f:\123.txt");

上述方法非常简单,并且在大多数情况下也非常有效,但在一些情况下,我们需要一些高级的应用,这时WebClient就不能满足我们的需求了(比如说我现在经常需要以ASII形式从Unix服务器中下载一些文本文件,如果直接WebClient下载就存在文本格式没有转换的问题)。这个时候我们便需要另一个类FtpWebRequest

FtpWebRequest通过ftp协议从 Internet 请求数据。FtpWebRequestHttpWebRequest一样,都是WebRequest的子类,都是基于.NET Framework 的请求/响应模型。下面的代码示例演示如何从 FTP 服务器上删除文件(代码来于MSDN)。

        public static bool DeleteFileOnServer(Uri serverUri)
        
{
            
// The serverUri parameter should use the ftp:// scheme. 
            
// It contains the name of the server file that is to be deleted. 
            
// Example: ftp://contoso.com/someFile.txt. 
            
// 
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            
{
                
return false;
            }

            
// Get the object used to communicate with the server. 
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
            request.Method 
= WebRequestMethods.Ftp.DeleteFile;
            FtpWebResponse response 
= (FtpWebResponse)request.GetResponse();
            Console.WriteLine(
"Delete status: {0}", response.StatusDescription);
            response.Close();
            
return true;
        }

从上述代码中我们可以看到,FtpWebRequestHttpWebRequest的使用方式非常类似。只要将FtpWebRequest的 Method 属性设置为 WebRequestMethods.Ftp 结构中定义的值,就能发送相应的 FTP 命令到服务器,执行相应的操作。

 关于ftp的更多信息,这里就不详作介绍,下面是我用FtpWebRequest对常用的操作进行了一点简单的封装,相信读了下列代码后会对FtpWebRequest有更多的了解的。

class FtpClient
    
{
        
string userName;
        
string passWord;

        
byte[] buffer = new byte[1024 * 20];

        
public FtpClient(string userName, string passWord)
        
{
            
this.userName = userName;
            
this.passWord = passWord;
        }


        
/// <summary>
        
/// 创建ftp请求信息
        
/// </summary>
        
/// <param name="url">目标url地址</param>
        
/// <param name="useBinary">是否使用二进制传输</param>

        private FtpWebRequest GetRequest(string url, bool useBinary)
        
{
            FtpWebRequest ftpRequest 
= (FtpWebRequest)WebRequest.Create(url);
            ftpRequest.Credentials 
= new NetworkCredential(userName, passWord);
            ftpRequest.UseBinary 
= useBinary;
            ftpRequest.KeepAlive 
= true;
            
return ftpRequest;
        }


        
private FtpWebRequest GetRequest(string url)
        
{
            
return GetRequest(url, false);
        }


        
string GetStreamText(Stream stream)
        
{
            StreamReader reader 
= new StreamReader(stream, Encoding.Default);
            
string text = reader.ReadToEnd();
            reader.Close();
            
return text;
        }


        
//将orgStream中的内容拷贝到desStream中
        void WriteStream(Stream orgStream, Stream desStream)
        
{
            
int num;
            
while ((num = orgStream.Read(buffer, 0, buffer.Length)) > 0)
            
{
                desStream.Write(buffer, 
0, num);
            }

            orgStream.Close();
            desStream.Close();
        }


        
/// <summary>
        
/// 列出ftp目录所包含的文件信息
        
/// </summary>
        
/// <param name="remoteDir">远程文件夹</param>
        
/// <returns>文件详细信息</returns>

        public string ListFiles(string remoteDir)
        
{
            FtpWebRequest request 
= GetRequest(remoteDir, false);
            request.Method 
= WebRequestMethods.Ftp.ListDirectoryDetails;
            
return GetStreamText(request.GetResponse().GetResponseStream());
        }


        
/// <summary>
        
/// 下载文件
        
/// </summary>
        
/// <param name="localFile">本地文件路径</param>
        
/// <param name="remoteFile">远程文件路径</param>
        
/// <param name="useBinary">是否采用二进制方式</param>

        public void DownloadFile(string localFile, string remoteFile, bool useBinary)
        
{
            FtpWebRequest request 
= GetRequest(remoteFile, useBinary);
            request.Method 
= WebRequestMethods.Ftp.DownloadFile;

            WriteStream(request.GetResponse().GetResponseStream(), File.Create(localFile));
        }


        
/// <summary>
        
/// 上传文件
        
/// </summary>
        
/// <param name="localFile">本地文件路径</param>
        
/// <param name="remoteFile">远程文件路径</param>
        
/// <param name="useBinary">是否采用二进制方式</param>

        public void UploadFile(string localFile, string remoteFile, bool useBinary)
        
{
            FileInfo fi 
= new FileInfo(localFile);
            FtpWebRequest request 
= GetRequest(remoteFile, useBinary);
            request.Method 
= WebRequestMethods.Ftp.UploadFile;
            request.ContentLength 
= fi.Length;

            WriteStream(fi.OpenRead(),request.GetRequestStream());
            request.GetResponse();
        }


        
//删除文件
        public void DeleteFile(string remoteFile)
        
{
            FtpWebRequest request 
= GetRequest(remoteFile);
            request.Method 
= WebRequestMethods.Ftp.DeleteFile;

            FtpWebResponse resp 
= request.GetResponse() as FtpWebResponse;
        }

    }