zoukankan      html  css  js  c++  java
  • C#操作FTP总结

      本文是对FTP相关操作,例如新建/删除目录、新建/删除文件、获取文件/目录列表等的总结,方便日后调用。

      其实C#操作FTP和操作本地文件/目录差不多,尤其是对动作而言,因为它们都是文件或目录,区别在于FTP可以是远程的文件或目录等,所以需要建立一个连接,当然由于是对FTP的请求,所以会要求从本地发起一个FtpWebRequest,当然这个请求中包含一些设置,例如:请求连接的信用凭证、数据的传输格式、以及请求的FTP动作等等,FTP服务器接收到这个请求后就会返回一个FtpWebResponse了。本来微软已经提供了操作FTP的一些方法,都在System.Net命名空间下,但是感觉用起来还是不是很方便,所以自己又总结了一下,权且当作是对一个简单地封装吧,方便以后再使用的时候可以拿来就用。

      由于这些方法都比较简单,而且每个方法我都加了中文注释,所以在此就不再赘述和分别描述了,直接上代码。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net;

    namespace PCT.FCL
    {
    public class FTPHelper : IDisposable
    {
    public FTPHelper(string requestUriString, string userName, string password)
    {
    this.requestUriString = requestUriString;
    this.userName = userName;
    this.password = password;
    }

    private string requestUriString;
    private string userName;
    private string password;
    private FtpWebRequest request;
    private FtpWebResponse response;

    /// <summary>
    /// 创建FtpWebRequest
    /// </summary>
    /// <param name="uriString">FTP路径</param>
    /// <param name="method">FTP方法</param>
    private void OpenRequest(string uriString, string method)
    {
    this.request = WebRequest.Create(new Uri(this.requestUriString + uriString)) as FtpWebRequest;
    this.request.Credentials = new NetworkCredential(userName, password);
    this.request.UseBinary = true;
    this.request.Method = method;
    }

    /// <summary>
    /// 返回FtpWebResponse
    /// </summary>
    /// <param name="uriString">FTP路径</param>
    /// <param name="method">FTP方法</param>
    private void OpenResponse(string uriString, string method)
    {
    this.OpenRequest(uriString, method);
    this.response = this.request.GetResponse() as FtpWebResponse;
    }

    /// <summary>
    /// 创建目录
    /// </summary>
    /// <param name="directoryPath">要创建的目录名称</param>
    public void MakeDirectory(string directoryPath)
    {
    this.OpenResponse(directoryPath, WebRequestMethods.Ftp.MakeDirectory);
    }

    /// <summary>
    /// 删除目录
    /// </summary>
    /// <param name="directoryPath">要删除的目录名称</param>
    public void RemoveDirectory(string directoryPath)
    {
    this.OpenResponse(directoryPath, WebRequestMethods.Ftp.RemoveDirectory);
    }

    /// <summary>
    /// 重命名文件
    /// </summary>
    /// <param name="originalFileName">原文件名</param>
    /// <param name="newFileName">新文件名</param>
    public void Rename(string originalFileName, string newFileName)
    {
    this.OpenResponse(originalFileName, WebRequestMethods.Ftp.Rename);
    this.request.RenameTo = newFileName;
    this.response = this.request.GetResponse() as FtpWebResponse;
    }

    /// <summary>
    /// 上传文件到服务器
    /// </summary>
    /// <param name="localFullPath">要上传的本地文件全路径</param>
    public void UploadFile(string localFullPath)
    {
    this.UploadFile(localFullPath, false);
    }

    /// <summary>
    /// 上传文件到服务器
    /// </summary>
    /// <param name="localFullPath">要上传的本地文件全路径</param>
    /// <param name="overWriteFile">是否要重写服务器上的文件</param>
    public void UploadFile(string localFullPath, bool overWriteFile)
    {
    this.UploadFile(localFullPath, Path.GetFileName(localFullPath), overWriteFile);
    }

    /// <summary>
    /// 上传文件到服务器
    /// </summary>
    /// <param name="localFullPath">要上传的本地文件全路径</param>
    /// <param name="remoteFileName">上传后文件重命名为</param>
    public void UploadFile(string localFullPath, string remoteFileName)
    {
    this.UploadFile(localFullPath, remoteFileName, false);
    }

    /// <summary>
    /// 上传文件到服务器
    /// </summary>
    /// <param name="localFullPath">要上传的本地文件全路径</param>
    /// <param name="remoteFileName">上传后文件重命名为</param>
    /// <param name="overWriteFile">是否要重写服务器上的文件</param>
    public void UploadFile(string localFullPath, string remoteFileName, bool overWriteFile)
    {
    byte[] fileBytes = null;
    using (FileStream fileStream = new FileStream(localFullPath, FileMode.Open, FileAccess.Read))
    {
    fileBytes
    = new byte[fileStream.Length];
    fileStream.Read(fileBytes,
    0, (Int32)fileStream.Length);
    }
    this.UploadFile(fileBytes, remoteFileName, overWriteFile);
    }

    /// <summary>
    /// 上传文件到服务器
    /// </summary>
    /// <param name="fileBytes">上传文件的字节流</param>
    /// <param name="remoteFileName">上传后文件重命名为</param>
    public void UploadFile(byte[] fileBytes, string remoteFileName)
    {
    this.UploadFile(fileBytes, remoteFileName, false);
    }

    /// <summary>
    /// 上传文件到服务器
    /// </summary>
    /// <param name="fileBytes">上传文件的字节流</param>
    /// <param name="remoteFileName">上传后文件重命名为</param>
    /// <param name="overWriteFile">是否要重写服务器上的文件</param>
    public void UploadFile(byte[] fileBytes, string remoteFileName, bool overWriteFile)
    {
    this.OpenResponse(overWriteFile ? remoteFileName : Gadget.ReturnFileNameWithCurrentDate(remoteFileName), WebRequestMethods.Ftp.UploadFile);
    using (Stream stream = this.request.GetRequestStream())
    {
    using (MemoryStream memoryStream = new MemoryStream(fileBytes))
    {
    byte[] buffer = new byte[Constant.FTP.LenOfBuffer];
    int bytesRead = 0;
    int totalRead = 0;
    while (true)
    {
    bytesRead
    = memoryStream.Read(buffer, 0, buffer.Length);
    if (bytesRead == 0)
    {
    break;
    }
    totalRead
    += bytesRead;
    stream.Write(buffer,
    0, bytesRead);
    }
    }
    this.response = this.request.GetResponse() as FtpWebResponse;
    }
    }

    /// <summary>
    /// 下载服务器文件到本地
    /// </summary>
    /// <param name="remoteFileName">要下载的服务器文件名</param>
    /// <param name="localPath">下载到本地的路径</param>
    public void DownloadFile(string remoteFileName, string localPath)
    {
    this.DownloadFile(remoteFileName, localPath, false);
    }

    /// <summary>
    /// 下载服务器文件到本地
    /// </summary>
    /// <param name="remoteFileName">要下载的服务器文件名</param>
    /// <param name="localPath">下载到本地的路径</param>
    /// <param name="overWriteFile">是否要重写本地的文件</param>
    public void DownloadFile(string remoteFileName, string localPath, bool overWriteFile)
    {
    this.DownloadFile(remoteFileName, localPath, remoteFileName, overWriteFile);
    }

    /// <summary>
    /// 下载服务器文件到本地
    /// </summary>
    /// <param name="remoteFileName">要下载的服务器文件名</param>
    /// <param name="localPath">下载到本地的路径</param>
    /// <param name="localFileName">下载到本地的文件重命名为</param>
    public void DownloadFile(string remoteFileName, string localPath, string localFileName)
    {
    this.DownloadFile(remoteFileName, localPath, localFileName, false);
    }

    /// <summary>
    /// 下载服务器文件到本地
    /// </summary>
    /// <param name="remoteFileName">要下载的服务器文件名</param>
    /// <param name="localPath">下载到本地的路径</param>
    /// <param name="localFileName">下载到本地的文件重命名为</param>
    /// <param name="overWriteFile">是否要重写本地的文件</param>
    public void DownloadFile(string remoteFileName, string localPath, string localFileName, bool overWriteFile)
    {
    byte[] fileBytes = this.DownloadFile(remoteFileName);
    if (fileBytes != null)
    {
    using (FileStream fileStream = new FileStream(Path.Combine(localPath, overWriteFile ? localFileName : Gadget.ReturnFileNameWithCurrentDate(localFileName)), FileMode.Create))
    {
    fileStream.Write(fileBytes,
    0, fileBytes.Length);
    fileStream.Flush();
    }
    }
    }

    /// <summary>
    /// 下载服务器文件到本地
    /// </summary>
    /// <param name="RemoteFileName">要下载的服务器文件名</param>
    /// <returns>文件的字节流</returns>
    public byte[] DownloadFile(string RemoteFileName)
    {
    this.OpenResponse(RemoteFileName, WebRequestMethods.Ftp.DownloadFile);
    using (Stream stream = this.response.GetResponseStream())
    {
    using (MemoryStream memoryStream = new MemoryStream(Constant.FTP.CapacityofMemeoryStream))
    {
    byte[] buffer = new byte[Constant.FTP.LenOfBuffer];
    int bytesRead = 0;
    int TotalRead = 0;
    while (true)
    {
    bytesRead
    = stream.Read(buffer, 0, buffer.Length);
    TotalRead
    += bytesRead;
    if (bytesRead == 0)
    break;
    memoryStream.Write(buffer,
    0, bytesRead);
    }
    return memoryStream.Length > 0 ? memoryStream.ToArray() : null;
    }
    }
    }

    /// <summary>
    /// 删除服务器文件
    /// </summary>
    /// <param name="directoryPath">要删除的文件路径</param>
    /// <param name="fileName">要删除的文件名</param>
    public void DeleteFile(string directoryPath, string fileName)
    {
    this.DeleteFile(directoryPath + fileName);
    }

    /// <summary>
    /// 删除服务器文件
    /// </summary>
    /// <param name="fileName">要删除的文件名</param>
    public void DeleteFile(string fileName)
    {
    this.OpenResponse(fileName, WebRequestMethods.Ftp.DeleteFile);
    }

    /// <summary>
    /// 列出服务器上指定目录下的所有文件
    /// </summary>
    /// <param name="directoryPath">指定的目录</param>
    /// <returns>文件名列表</returns>
    public string[] LisFiles(string directoryPath)
    {
    List
    <string> filesList = new List<string>();
    this.OpenResponse(directoryPath, WebRequestMethods.Ftp.ListDirectory);
    using (StreamReader streamReader = new StreamReader(this.response.GetResponseStream()))
    {
    return Gadget.SplitString(streamReader.ReadToEnd(), Constant.TextConstant.FtpNewLine);
    }
    }

    /// <summary>
    /// 列出服务器上指定目录下的所有子目录
    /// </summary>
    /// <param name="directoryPath">指定的目录</param>
    /// <returns>子目录名列表</returns>
    public string[] ListDirectories(string directoryPath)
    {
    List
    <string> directoriesList = new List<string>();
    this.OpenResponse(directoryPath, WebRequestMethods.Ftp.ListDirectoryDetails);
    using (StreamReader streamReader = new StreamReader(this.response.GetResponseStream()))
    {
    string line = streamReader.ReadLine();
    if (line != null)
    {
    while (line != null)
    {
    //line = drwxrwxrwx 1 user group 0 Jul 15 18:17 Archive_20110714
    line = line.Substring(line.LastIndexOf(Constant.TextConstant.Colon) + Constant.FTP.LenToDirectory);
    if (!line.StartsWith(Constant.FileConstant.FileTypeSeperator))//remove the folder like . or ..
    {
    directoriesList.Add(line);
    }
    line
    = streamReader.ReadLine();
    }
    return directoriesList.ToArray<string>();
    }
    }
    return null;
    }

    /// <summary>
    /// 检查指定的目录是否在服务器上存在
    /// </summary>
    /// <param name="directory">指定的目录</param>
    /// <returns>如果存在返回true,否则返回false</returns>
    public bool DirectoryExist(string directory)
    {
    try
    {
    this.OpenResponse(directory, WebRequestMethods.Ftp.GetDateTimestamp);
    return true;
    }
    catch (Exception)
    {
    return false;
    }
    }

    /// <summary>
    /// 检查指定的文件是否在服务器上存在
    /// </summary>
    /// <param name="directoryPath">指定的目录</param>
    /// <param name="remoteFileName">指定的文件</param>
    /// <returns>如果存在返回true,否则返回false</returns>
    public bool FileExist(string directoryPath, string remoteFileName)
    {
    string[] fileNames = this.LisFiles(directoryPath);
    foreach (string fileName in fileNames)
    {
    if (string.Compare(fileName, remoteFileName, true) == 0)
    {
    return true;
    }
    }
    return false;
    }

    /// <summary>
    /// 释放资源
    /// </summary>
    public void Dispose()
    {
    this.Close();
    }

    /// <summary>
    /// 释放资源
    /// </summary>
    public void Close()
    {
    if (this.response != null)
    {
    this.response.Close();
    this.response = null;
    }
    }
    }
    }

      

  • 相关阅读:
    c#实现MD5加密
    AJAX学习笔记 一:简单的XMLHTTPRequest示例和asp.net异步更新。
    客户端JS验证fileupload控件,设置只允许特定的文件类型。
    三层架构下的用户登录检测。
    常用用户注册页面客户端验证脚本。
    Android Debug Bridge 技术实现原理
    Android反编译与防止反编译
    android用sharepreference保存输入框中的内容
    android include 控件详解
    android程序排序算法实现
  • 原文地址:https://www.cnblogs.com/panchunting/p/FTP.html
Copyright © 2011-2022 走看看