C#调用第三方工具完成FTP操作

 

一、FileZilla

Filezilla分为client和server。其中FileZilla Server是Windows平台下一个小巧的第三方FTP服务器软件,系统资源也占用非常小,可以让你快速简单的建立自己的FTP服务器。

打开FileZilla,进行如下操作

下图红色区域就是linux系统的文件目录,可以直接把windows下的文件直接拖拽进去。

 

二、WinSCP

跟FileZilla一样,也是一款十分方便的文件传输工具。WinSCP是连接Windows和Linux的。

WinSCP .NET Assembly and SFTP

https://winscp.net/eng/docs/library#csharp

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
  Protocol = Protocol.Sftp,
  HostName = "example.com",
  UserName = "user",
  Password = "mypassword",
  SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
};

using (Session session = new Session())
{
  // Connect
  session.Open(sessionOptions);

  // Upload files
  TransferOptions transferOptions = new TransferOptions();
  transferOptions.TransferMode = TransferMode.Binary;

  TransferOperationResult transferResult;
  transferResult =  session.PutFiles(@"d:\toupload\*", "/home/user/", false, transferOptions);

  // Throw on any error
  transferResult.Check();

  // Print results
  foreach (TransferEventArgs transfer in transferResult.Transfers)
  {
      Console.WriteLine("Upload of {0} succeeded", transfer.FileName);
  }
}

 

三、FluentFTP

FluentFTP是一款老外开发的基于.Net的支持FTP及的FTPS 的FTP类库,FluentFTP是完全托管的FTP客户端,被设计为易于使用和易于扩展。它支持文件和目录列表,上传和下载文件和SSL / TLS连接。

它底层由Socket实现,可以连接到Unix和Windows IIS建立FTP的服务器,

github:https://github.com/robinrodricks/FluentFTP

举例:

// create an FTP client
FtpClient client = new FtpClient("123.123.123.123");

// if you don't specify login credentials, we use the "anonymous" user account
client.Credentials = new NetworkCredential("david", "pass123");

// begin connecting to the server
client.Connect();

// get a list of files and directories in the "/htdocs" folder
foreach (FtpListItem item in client.GetListing("/htdocs")) {
  
  // if this is a file
  if (item.Type == FtpFileSystemObjectType.File){
      
      // get the file size
      long size = client.GetFileSize(item.FullName);
      
  }
  
  // get modified date/time of the file or folder
  DateTime time = client.GetModifiedTime(item.FullName);
  
  // calculate a hash for the file on the server side (default algorithm)
  FtpHash hash = client.GetHash(item.FullName);
  
}

// upload a file
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt");

// rename the uploaded file
client.Rename("/htdocs/big.txt", "/htdocs/big2.txt");

// download the file again
client.DownloadFile(@"C:\MyVideo_2.mp4", "/htdocs/big2.txt");

// delete the file
client.DeleteFile("/htdocs/big2.txt");

// delete a folder recursively
client.DeleteDirectory("/htdocs/extras/");

// check if a file exists
if (client.FileExists("/htdocs/big2.txt")){ }

// check if a folder exists
if (client.DirectoryExists("/htdocs/extras/")){ }

// upload a file and retry 3 times before giving up
client.RetryAttempts = 3;
client.UploadFile(@"C:\MyVideo.mp4", "/htdocs/big.txt", FtpExists.Overwrite, false, FtpVerify.Retry);

// disconnect! good bye!
client.Disconnect();

对FluentFTP部分操作封装类

public class FtpFileMetadata
{
  public long FileLength { get; set; }
  public string MD5Hash { get; set; }
  public DateTime LastModifyTime { get; set; }
}

public class FtpHelper
{
  private FtpClient _client = null;
  private string _host = "127.0.0.1";
  private int _port = 21;
  private string _username = "Anonymous";
  private string _password = "";
  private string _workingDirectory = "";
  public string WorkingDirectory
  {
      get
      {
          return _workingDirectory;
      }
  }
  public FtpHelper(string host, int port, string username, string password)
  {
      _host = host;
      _port = port;
      _username = username;
      _password = password;
  }

  public Stream GetStream(string remotePath)
  {
      Open();
      return _client.OpenRead(remotePath);
  }

  public void Get(string localPath, string remotePath)
  {
      Open();
      _client.DownloadFile(localPath, remotePath, true);
  }

  public void Upload(Stream s, string remotePath)
  {
      Open();
      _client.Upload(s, remotePath, FtpExists.Overwrite, true);
  }

  public void Upload(string localFile, string remotePath)
  {
      Open();
      using (FileStream fileStream = new FileStream(localFile, FileMode.Open))
      {
          _client.Upload(fileStream, remotePath, FtpExists.Overwrite, true);
      }
  }

  public int UploadFiles(IEnumerable<string> localFiles, string remoteDir)
  {
      Open();
      List<FileInfo> files = new List<FileInfo>();
      foreach (var lf in localFiles)
      {
          files.Add(new FileInfo(lf));
      }
      int count = _client.UploadFiles(files, remoteDir, FtpExists.Overwrite, true, FtpVerify.Retry);
      return count;
  }

  public void MkDir(string dirName)
  {
      Open();
      _client.CreateDirectory(dirName);
  }

  public bool FileExists(string remotePath)
  {
      Open();
      return _client.FileExists(remotePath);
  }
  public bool DirExists(string remoteDir)
  {
      Open();
      return _client.DirectoryExists(remoteDir);
  }

  public FtpListItem[] List(string remoteDir)
  {
      Open();
      var f = _client.GetListing();
      FtpListItem[] listItems = _client.GetListing(remoteDir);
      return listItems;
  }

  public FtpFileMetadata Metadata(string remotePath)
  {
      Open();
      long size = _client.GetFileSize(remotePath);
      DateTime lastModifyTime = _client.GetModifiedTime(remotePath);

      return new FtpFileMetadata()
      {
          FileLength = size,
          LastModifyTime = lastModifyTime
      };
  }

  public bool TestConnection()
  {
      return _client.IsConnected;
  }

  public void SetWorkingDirectory(string remoteBaseDir)
  {
      Open();
      if (!DirExists(remoteBaseDir))
          MkDir(remoteBaseDir);
      _client.SetWorkingDirectory(remoteBaseDir);
      _workingDirectory = remoteBaseDir;
  }
  private void Open()
  {
      if (_client == null)
      {
          _client = new FtpClient(_host, new System.Net.NetworkCredential(_username, _password));
          _client.Port = 21;
          _client.RetryAttempts = 3;
          if (!string.IsNullOrWhiteSpace(_workingDirectory))
          {
              _client.SetWorkingDirectory(_workingDirectory);
          }
      }
  }
}

关于C#调用第三方工具完成FTP操作的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程宝库

 一、概述1、WebRequest:对统一资源标识符 (URI) 发出请求。 这是一个 abstract 类。WebRequest的派生类: ...