C#调用第三方工具完成FTP操作
作者:springsnow 时间:2021-08-23 09:52:48
一、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);
}
}
}
}
来源:https://www.cnblogs.com/springsnow/p/10149301.html
标签:C#,第三方,工具,FTP,操作
0
投稿
猜你喜欢
基于opencv实现车道线检测
2023-03-11 10:07:52
C#递归应用之实现JS文件的自动引用
2023-12-09 00:03:52
Java实现角色扮演游戏的示例代码
2023-03-31 19:41:45
C#学习笔记整理_深入剖析构造函数、析构函数
2022-10-26 18:37:20
C#如何使用Task类解决线程的等待问题
2023-01-04 18:23:22
Java花式解决'分割回文串 ii'问题详解
2022-07-09 02:01:58
android开发教程之自定义属性用法详解
2022-09-22 20:26:17
Java由浅入深带你了解什么是包package
2022-04-17 02:33:39
Java 通过AQS实现数据组织
2023-04-05 22:19:29
Feign远程调用Multipartfile参数处理
2022-09-22 02:46:24
Java深入了解数据结构中常见的排序算法
2021-11-02 23:33:53
HashMap在JDK7与JDK8中的实现过程解析
2022-03-04 18:26:44
SpringMVC后端返回数据到前端代码示例
2023-06-20 13:12:47
浅析Spring和MyBatis整合及逆向工程
2022-07-09 08:27:11
SpringBoot自动装配之Condition深入讲解
2023-12-03 02:20:29
基于SpringBoot多线程@Async的使用体验
2021-07-15 04:47:04
深入浅析jni中的java接口使用
2023-07-22 19:54:23
Android开发中应用程序分享功能实例
2021-05-27 20:38:46
JavaWeb简单文件上传流程的实战记录
2023-04-02 09:14:59
Java基于Tcp协议的socket编程实例
2022-03-08 00:04:13