gpt4 book ai didi

c# - C#递归上传到FTP服务器

转载 作者:行者123 更新时间:2023-12-02 02:56:49 24 4
gpt4 key购买 nike

我需要通过 C# 代码将文件夹(包含子文件夹和文件)从一台服务器上传到另一台服务器。我做了一些研究,发现我们可以使用 FTP 实现这一点。但是有了它,我只能移动文件而不是整个文件夹。在这里的任何帮助表示赞赏。

最佳答案

FtpWebRequest(也不是 .NET 框架中的任何其他 FTP 客户端)确实没有对递归文件操作(包括上传)的任何明确支持。你必须自己实现递归:

  • 列出本地目录
  • 迭代条目、上传文件并递归到子目录(再次列出它们等)
void UploadFtpDirectory(
string sourcePath, string url, NetworkCredential credentials)
{
IEnumerable<string> files = Directory.EnumerateFiles(sourcePath);
foreach (string file in files)
{
using (WebClient client = new WebClient())
{
Console.WriteLine($"Uploading {file}");
client.Credentials = credentials;
client.UploadFile(url + Path.GetFileName(file), file);
}
}

IEnumerable<string> directories = Directory.EnumerateDirectories(sourcePath);
foreach (string directory in directories)
{
string name = Path.GetFileName(directory);
string directoryUrl = url + name;

try
{
Console.WriteLine($"Creating {name}");
FtpWebRequest requestDir =
(FtpWebRequest)WebRequest.Create(directoryUrl);
requestDir.Method = WebRequestMethods.Ftp.MakeDirectory;
requestDir.Credentials = credentials;
requestDir.GetResponse().Close();
}
catch (WebException ex)
{
FtpWebResponse response = (FtpWebResponse)ex.Response;
if (response.StatusCode ==
FtpStatusCode.ActionNotTakenFileUnavailable)
{
// probably exists already
}
else
{
throw;
}
}

UploadFtpDirectory(directory, directoryUrl + "/", credentials);
}
}

有关创建文件夹的复杂代码背景,请参阅:
How to check if an FTP directory exists

使用如下函数:

string sourcePath = @"C:\source\local\path";
// root path must exist
string url = "ftp://ftp.example.com/target/remote/path/";
NetworkCredential credentials = new NetworkCredential("username", "password");

UploadFtpDirectory(sourcePath, url, credentials);

一个更简单的变体,如果你不需要递归上传:
Upload directory of files to FTP server using WebClient


或者使用可以自行递归的FTP库。

例如 WinSCP .NET assembly您可以通过一次调用 Session.PutFilesToDirectory 来上传整个目录:

// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
};

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

// Download files
session.PutFilesToDirectory(
@"C:\source\local\path", "/target/remote/path").Check();
}

Session.PutFilesToDirectory method默认是递归的。

(我是 WinSCP 的作者)

关于c# - C#递归上传到FTP服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60925131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com