.NET之FTP文件上传下载

来源:互联网 发布:python 爬虫 伯乐 编辑:程序博客网 时间:2024/04/29 16:09

转自MSDN

WebRequest是一个抽象类, HttpWebRequestFtpWebRequest都是它的子类。

WebResponse也是一个抽象类, HttpWebResponseFtpWebResponse都是它的子类。

WebRequest, HttpWebRequest能完成的工作WebClient也都能做,那他们有何区别?.Net框架中已经为我们提供了WebRequest和WebResponse两个强大的类来处理向URI标示的资源和获取数据了。然后,不足的是利用WebRequest和WebResponse时设置过于复杂。使用起来颇为费劲。于是乎有了现在的WebClient,WebClient其实可以理解为对WebRequest和WebResponse等协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地方。那就是缺少对cookies/session的支持,用户无法对是否自动url转向的控制,还有就是缺少对代理服务器的支持。

使用异步操作将文件上载到 FTP 服务器

using System;using System.Net;using System.Threading;using System.IO;namespace Examples.System.Net{    public class FtpState    {        private ManualResetEvent wait;        private FtpWebRequest request;        private string fileName;        private Exception operationException = null;        string status;                public FtpState()        {            wait = new ManualResetEvent(false);        }                public ManualResetEvent OperationComplete        {            get {return wait;}        }                public FtpWebRequest Request        {            get {return request;}            set {request = value;}        }                public string FileName        {            get {return fileName;}            set {fileName = value;}        }        public Exception OperationException        {            get {return operationException;}            set {operationException = value;}        }        public string StatusDescription        {            get {return status;}            set {status = value;}        }    }    public class AsynchronousFtpUpLoader    {          // Command line arguments are two strings:        // 1. The url that is the name of the file being uploaded to the server.        // 2. The name of the file on the local machine.        //        public static void Main(string[] args)        {            // Create a Uri instance with the specified URI string.            // If the URI is not correctly formed, the Uri constructor            // will throw an exception.            ManualResetEvent waitObject;                        Uri target = new Uri (args[0]);            string fileName = args[1];            FtpState state = new FtpState();            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);            request.Method = WebRequestMethods.Ftp.UploadFile;                        // This example uses anonymous logon.            // The request is anonymous by default; the credential does not have to be specified.             // The example specifies the credential only to            // control how actions are logged on the server.                        request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");                        // Store the request in the object that we pass into the            // asynchronous operations.            state.Request = request;            state.FileName = fileName;                        // Get the event to wait on.            waitObject = state.OperationComplete;                        // Asynchronously get the stream for the file contents.            request.BeginGetRequestStream(                new AsyncCallback (EndGetStreamCallback),                 state            );                        // Block the current thread until all operations are complete.            waitObject.WaitOne();                        // The operations either completed or threw an exception.            if (state.OperationException != null)            {                throw state.OperationException;            }            else            {                Console.WriteLine("The operation completed - {0}", state.StatusDescription);            }        }        private static void EndGetStreamCallback(IAsyncResult ar)        {            FtpState state = (FtpState) ar.AsyncState;                        Stream requestStream = null;            // End the asynchronous call to get the request stream.            try            {                requestStream = state.Request.EndGetRequestStream(ar);                // Copy the file contents to the request stream.                const int bufferLength = 2048;                byte[] buffer = new byte[bufferLength];                int count = 0;                int readBytes = 0;                FileStream stream = File.OpenRead(state.FileName);                do                {                    readBytes = stream.Read(buffer, 0, bufferLength);                    requestStream.Write(buffer, 0, readBytes);                    count += readBytes;                }                while (readBytes != 0);                Console.WriteLine ("Writing {0} bytes to the stream.", count);                // IMPORTANT: Close the request stream before sending the request.                requestStream.Close();                // Asynchronously get the response to the upload request.                state.Request.BeginGetResponse(                    new AsyncCallback (EndGetResponseCallback),                     state                );            }             // Return exceptions to the main application thread.            catch (Exception e)            {                Console.WriteLine("Could not get the request stream.");                state.OperationException = e;                state.OperationComplete.Set();                return;            }                   }                // The EndGetResponseCallback method          // completes a call to BeginGetResponse.        private static void EndGetResponseCallback(IAsyncResult ar)        {            FtpState state = (FtpState) ar.AsyncState;            FtpWebResponse response = null;            try             {                response = (FtpWebResponse) state.Request.EndGetResponse(ar);                response.Close();                state.StatusDescription = response.StatusDescription;                // Signal the main application thread that                 // the operation is complete.                state.OperationComplete.Set();            }            // Return exceptions to the main application thread.            catch (Exception e)            {                Console.WriteLine ("Error getting response.");                state.OperationException = e;                state.OperationComplete.Set();            }        }    }}
如何使用 WebClient 类从 FTP 服务器下载文件

public static bool DisplayFileFromServer(Uri serverUri){    // The serverUri parameter should start with the ftp:// scheme.    if (serverUri.Scheme != Uri.UriSchemeFtp)    {        return false;    }    // Get the object used to communicate with the server.    WebClient request = new WebClient();        // This example assumes the FTP site uses anonymous logon.    request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");    try     {        byte [] newFileData = request.DownloadData (serverUri.ToString());        string fileString = System.Text.Encoding.UTF8.GetString(newFileData);        Console.WriteLine(fileString);    }    catch (WebException e)    {        Console.WriteLine(e.ToString());    }    return true;}

如何从 FTP 服务器上删除文件

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;}


0 0
原创粉丝点击