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

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Vulnerabilities – Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Project Zero
Project Zero
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Hacker News: Front Page
Help Net Security
Help Net Security
S
Schneier on Security
A
Arctic Wolf
Know Your Adversary
Know Your Adversary
L
LINUX DO - 热门话题
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LangChain Blog
T
The Exploit Database - CXSecurity.com
V2EX - 技术
V2EX - 技术
罗磊的独立博客
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
有赞技术团队
有赞技术团队
P
Privacy & Cybersecurity Law Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
J
Java Code Geeks
量子位
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
云风的 BLOG
云风的 BLOG
SecWiki News
SecWiki News
Hacker News: Ask HN
Hacker News: Ask HN
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Troy Hunt's Blog
U
Unit 42
N
Netflix TechBlog - Medium
阮一峰的网络日志
阮一峰的网络日志
The Register - Security
The Register - Security
Recorded Future
Recorded Future
爱范儿
爱范儿
Webroot Blog
Webroot Blog
Engineering at Meta
Engineering at Meta

博客园 - 唐朝程序员

推荐一个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;
        }

    }