[转载]ASP.NET FTP的操作(包括上传、下载、重命名、删除、检查是否存在)

转载自:https://www.cnblogs.com/zhzhx/archive/2013/05/08/3065973.html (若侵权请联系我删除)


ASP.NET中,有时候会遇到把文件上传到ftp或者从ftp上下载文件的操作,下文针对这些操作一一展开。

首先,引用命名空间。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Text;
using System.Net;
using System.Data;
using System.IO;
using System.ComponentModel;

其中,前四个是新建ASP.NET时自动添加的,后五个为手动添加。

然后,在class1类中(假设新添加的类为class1)声明全局变量,即ftp登陆所需的用户名和密码。

1  private string ftpUser = "username";   //ftp用户名
2  private string ftpPassword = "12345";   //ftp密码

接着就是上传、下载、重命名、删除和检查存在的方法了。

1.上传文件到ftp

上传的方法代码如下:

/// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="localFile1">本地文件路径及文件名</param>
        /// <param name="ftpFileName">ftp文件路径及文件名(文件名可重命名)</param>
        /// <returns>返回bool值</returns>
        public bool fileUpload(string localFile1, string ftpFileName)
        {
            FileInfo localFile = new FileInfo(localFile1);
            bool success = false;
            FtpWebRequest ftpWebRequest = null;
            FileStream localFileStream = null;
            Stream requestStream = null;
            try
            {
                string uri = ftpFileName;
                ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                ftpWebRequest.UseBinary = true;//指定数据传输类型为二进制
                ftpWebRequest.KeepAlive = false;//成功执行一个命令后连接被关闭
                ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;// 指定执行什么命令
                ftpWebRequest.ContentLength = localFile.Length;//上传文件时通知服务器文件的大小 
                int buffLength = 20480;// 缓冲大小设置为20kb
                byte[] buff = new byte[buffLength];
                int contentLen;
                localFileStream = localFile.OpenRead();//打开一个文件流去读上传的文件
                requestStream = ftpWebRequest.GetRequestStream();//把上传的文件写入流
                contentLen = localFileStream.Read(buff, 0, buffLength);//每次读文件流的2kb
                while (contentLen != 0)// 流内容没有结束
                {
                    // 把内容从file stream 写入 upload stream
                    requestStream.Write(buff, 0, contentLen);
                    contentLen = localFileStream.Read(buff, 0, buffLength);
                }
                success = true;
            }
            catch (Exception)
            {
                success = false;
            }
            finally
            {
                if (requestStream != null)
                {
                    requestStream.Close();
                }
                if (localFileStream != null)
                {
                    localFileStream.Close();
                }
            }
            return success;
        }

调用方法为实例化类对象,然后通过类对象直接调用。

示例:假设该方法包含在class1类中(以下方法均假设包含在class1中),则有:

1   class1 ftpClient1 = new class1();  //实例化类FTPClient
2   ftpClient1.fileUpload("D:\\456.png", "ftp://192.18.13.11/123.png");    //上传文件

另一种方法支持断点续传的方法如下:

添加命名空间:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.IO;
using System.Net;
using System.Net.Security;
using System.Collections;

using System.Security.Cryptography.X509Certificates;

using System.Web.Configuration;

class1类中的代码如下:

public class class1
    {
        private NetworkCredential certificate;
        /// <summary>
        /// 构造函数,提供初始化数据的功能,打开Ftp站点
        /// </summary>
        public class1()
        {
            certificate = new NetworkCredential("administrator", "cnugis202");
        }
        /// <summary>
        /// 创建FTP请求
        /// </summary>
        /// <param name="uri">ftp://myserver/upload.txt</param>
        /// <param name="method">Upload/Download</param>
        /// <returns></returns>
        private FtpWebRequest CreateFtpWebRequest(Uri uri, string method)
        {
            FtpWebRequest ftpClientRequest = (FtpWebRequest)WebRequest.Create(uri);
            ftpClientRequest.Proxy = null;
            ftpClientRequest.Credentials = certificate;
            ftpClientRequest.KeepAlive = true;
            ftpClientRequest.UseBinary = true;
            ftpClientRequest.UsePassive = true;
            ftpClientRequest.Method = method;
            //ftpClientRequest.Timeout = -1;
            return ftpClientRequest;
        }
        //支持断点续传
        public bool UploadFile(string sourceFile, Uri destinationPath, int offSet, string ftpMethod)
        {
            try
            {
                FileInfo file = new FileInfo(sourceFile);
                Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);
                FtpWebRequest request = CreateFtpWebRequest(uri, ftpMethod);
                request.ContentOffset = offSet;
                Stream requestStream = request.GetRequestStream();//需要获取文件的流
                FileStream fileStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);//创建存储文件的流
                int sourceLength = (int)fileStream.Length;
                offSet = CopyDataToDestination(fileStream, requestStream, offSet);
                WebResponse response = request.GetResponse();
                response.Close();
                if (offSet != 0)
                {
                    UploadFile(sourceFile, destinationPath, offSet, WebRequestMethods.Ftp.AppendFile);
                }
            }
            catch (Exception ex)
            {
                ex.ToString();
                return false;
            }
            return true;
        }
        private int CopyDataToDestination(Stream sourceStream, Stream destinationStream, int offSet)
        {
            try
            {
                int sourceLength = (int)sourceStream.Length;
                int length = sourceLength - offSet;
                byte[] buffer = new byte[length + offSet];
                int bytesRead = sourceStream.Read(buffer, offSet, length);
                while (bytesRead != 0)
                {
                    destinationStream.Write(buffer, 0, bytesRead);
                    bytesRead = sourceStream.Read(buffer, 0, length);
                    length = length - bytesRead;
                    offSet = (bytesRead == 0) ? 0 : (sourceLength - length);//(length - bytesRead);                  
                }
            }
            catch (Exception ex)
            {
                string error = ex.ToString();
                return offSet;
            }
            finally
            {
                destinationStream.Close();
                sourceStream.Close();
            }
            return offSet;
        }
    }

调用方法为:

1 class1 ftpClientService = new class1();   //实例化class1类对象
2 ftpClientService.UploadFile("D:\\456.png",  new Uri("ftp://192.18.13.11/123.png“), 0, WebRequestMethods.Ftp.UploadFile);//调用class1类的UploadFile方法上传

2.从ftp下载文件

下载的方法代码如下:

/// <summary> 
        /// 下载文件 
        /// </summary> 
        /// <param name="localFileName">下载的ftp的文件路径及文件名</param> 
        /// <param name="ftpFileName">本地文件路径及文件名(文件名可重命名)</param> 
        /// <returns>返回值</returns>
        public bool fileDownload(string ftpFileName, string localFileName)
        {
            bool success = false;
            FtpWebRequest ftpWebRequest = null;
            FtpWebResponse ftpWebResponse = null;
            Stream ftpResponseStream = null;
            FileStream outputStream = null;
            try
            {
                outputStream = new FileStream(localFileName, FileMode.Create);
                string uri = ftpFileName;
                ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                ftpWebRequest.UseBinary = true;
                ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
                ftpResponseStream = ftpWebResponse.GetResponseStream();
                long contentLength = ftpWebResponse.ContentLength;
                int bufferSize = 20480;
                byte[] buffer = new byte[bufferSize];
                int readCount;
                readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
                }
                success = true;
            }
            catch (Exception)
            {
                success = false;
            }
            finally
            {
                if (outputStream != null)
                {
                    outputStream.Close();
                }
                if (ftpResponseStream != null)
                {
                    ftpResponseStream.Close();
                }
                if (ftpWebResponse != null)
                {
                    ftpWebResponse.Close();
                }
            }
            return success;
        }

调用方法为:

1        class1 ftpClient2 = new class1();  //实例化类FTPClient
2             ftpClient2.fileDownload(ftp://192.18.13.11/123.png","D:\\123.png);     //下载文件

3.在ftp上重命名文件

对ftp文件的重命名,方法代码如下:

/// <summary> 
        /// 重命名 
        /// </summary> 
        /// <param name="ftpPath">ftp文件路径(不包含文件名)</param> 
        /// <param name="currentFilename">ftp文件的当前文件名</param> 
        /// <param name="newFilename">ftp文件的重命名后的新文件名</param> 
        /// <returns>返回值</returns>
        public bool fileRename(string ftpPath, string currentFileName, string newFileName)
        {
            bool success = false;
            FtpWebRequest ftpWebRequest = null;
            FtpWebResponse ftpWebResponse = null;
            Stream ftpResponseStream = null;
            try
            {
                string uri = ftpPath + currentFileName;
                ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                ftpWebRequest.UseBinary = true;
                ftpWebRequest.Method = WebRequestMethods.Ftp.Rename;
                ftpWebRequest.RenameTo = newFileName;
                ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
                ftpResponseStream = ftpWebResponse.GetResponseStream();
            }
            catch (Exception)
            {
                success = false;
            }
            finally
            {
                if (ftpResponseStream != null)
                {
                    ftpResponseStream.Close();
                }
                if (ftpWebResponse != null)
                {
                    ftpWebResponse.Close();
                }
            }
            return success;
        }

调用方法为:

1             class1 ftpClient3 = new class1();  //实例化类对象
2             ftpClient3.fileRename(ftp://192.18.13.11/, "123.png", "456.png");      //ftp上重命名文件

4.删除ftp上的文件


删除ftp上文件的方法代码为:

/// <summary>
        /// 删除文件
        /// </summary>
        /// <param name="ftpPath">ftp文件路径(不包含文件名)</param>
        /// <param name="ftpName">文件名</param>
        /// <returns>返回值</returns>
        public bool fileDelete(string ftpPath, string ftpName)
        {
            bool success = false;
            FtpWebRequest ftpWebRequest = null;
            FtpWebResponse ftpWebResponse = null;
            Stream ftpResponseStream = null;
            StreamReader streamReader = null;
            try
            {
                string uri = ftpPath + ftpName;
                ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                ftpWebRequest.KeepAlive = false;
                ftpWebRequest.Method = WebRequestMethods.Ftp.DeleteFile;
                ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
                long size = ftpWebResponse.ContentLength;
                ftpResponseStream = ftpWebResponse.GetResponseStream();
                streamReader = new StreamReader(ftpResponseStream);
                string result = String.Empty;
                result = streamReader.ReadToEnd();
                success = true;
            }
            catch (Exception)
            {
                success = false;
            }
            finally
            {
                if (streamReader != null)
                {
                    streamReader.Close();
                }
                if (ftpResponseStream != null)
                {
                    ftpResponseStream.Close();
                }
                if (ftpWebResponse != null)
                {
                    ftpWebResponse.Close();
                }
            }
            return success;
        }

调用方法:

1             class1 ftpClient4 = new class1();  //实例化类对象
2             ftpClient4.fileDelete(ftp://192.18.13.11/, "456.png");     //删除ftp文件

5.检查ftp上某文件是否存在

/// <summary> 
        /// 检查文件是否存在 
        /// </summary> 
        /// <param name="ftpPath"></param> 
        /// <param name="ftpName"></param> 
        /// <returns></returns> 
        public bool fileCheckExist(string ftpPath, string ftpName)
        {
            bool success = false;
            FtpWebRequest ftpWebRequest = null;
            WebResponse webResponse = null;
            StreamReader reader = null;
            try
            {
                string url = ftpPath;
                ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
                ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
                ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
                ftpWebRequest.KeepAlive = false;
                webResponse = ftpWebRequest.GetResponse();
                reader = new StreamReader(webResponse.GetResponseStream());
                string line = reader.ReadLine();
                while (line != null)
                {
                    if (line == ftpName)
                    {
                        success = true;
                        break;
                    }
                    line = reader.ReadLine();
                }
            }
            catch (Exception)
            {
                success = false;
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (webResponse != null)
                {
                    webResponse.Close();
                }
            }
            return success;
        }

调用方法为:

class1 ftpClient5 = new class1();  //实例化类对象
            bool flag = ftpClient5.fileCheckExist(ftp://192.18.13.11/, "123.png");    //检查文件是否存在
            if (flag == true)
            {
                this.Response.Write("<script>alert('文件存在!')</script>");
            }
            else
            {
                this.Response.Write("<script>alert('文件不存在!')</script>");
            }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值