在c#中,是否有可能检查某个FTP文件夹中的文件并上传不在那里的文件?
本文关键字:文件 在那里 文件夹 FTP 是否 有可能 检查 | 更新日期: 2023-09-27 18:15:30
我想写一个c#:
- 使用用户名和密码访问FTP
- 转到某个文件夹
- 查看我PC文件夹中没有的文件并上传它们。
我的想法:我的电脑里有一个名为"mods"的文件夹,FTP里有另一个名为"mods"的文件夹,所以我不想打开"FileZilla"软件,而是想写一个c#连接到FTP,检查哪些文件不在那里。
非常感谢!
您可以像这样列出您的文件inftp服务器,并与mod dir
列表文件进行比较。 FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpRequest.Credentials =new NetworkCredential("anonymous","janeDoe@contoso.com");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
对于一个纯。net框架(它的FtpWebRequest
类)来说,没有什么神奇的方法。你必须给它编码。
- 列出FTP文件夹
- 列出本地文件夹
- 查找丢失的文件
- 依次上传
void SynchronizeLocalAndFtpDirectory(
string localPath, string remoteUri, NetworkCredential credentials)
{
List<string> remoteFiles = new List<string>();
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(remoteUri);
request.Credentials = credentials;
request.Method = WebRequestMethods.Ftp.ListDirectory;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
while (!reader.EndOfStream)
{
remoteFiles.Add(reader.ReadLine());
}
}
IEnumerable<string> localFiles =
Directory.GetFiles(localPath).Select(path => Path.GetFileName(path));
IEnumerable<string> missingFiles = localFiles.Except(remoteFiles);
foreach (string filename in missingFiles)
{
Console.WriteLine("Uploading missing file {0}", filename);
string remoteFileUri = remoteUri + filename;
string localFilePath = Path.Combine(localPath, filename);
FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(remoteFileUri);
uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
uploadRequest.Credentials = credentials;
using (Stream targetStream = uploadRequest.GetRequestStream())
using (Stream sourceStream = File.OpenRead(localFilePath))
{
byte[] buffer = new byte[10240];
int read;
while ((read = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
{
targetStream.Write(buffer, 0, read);
}
}
}
}
使用如下函数:
SynchronizeLocalAndFtpDirectory(
@"C:'local'mods", "ftp://ftp.example.com/remote/mods/",
new NetworkCredential("username", "password"));
(不要忘记URI中的尾斜杠)。
或者使用第三方支持同步的FTP库
例如,使用WinSCP . net程序集,这就像调用Session.SynchronizeDirectories
一样简单。
它不仅可以上传丢失的文件,还可以更新过期的文件,并有选择地删除孤儿文件。
void SynchronizeLocalAndFtpDirectory(
string localPath, string remotePath, SessionOptions sessionOptions)
{
using (Session session = new Session())
{
session.Open(sessionOptions);
session.SynchronizeDirectories(
SynchronizationMode.Remote, localPath, remotePath, false).Check();
}
}
使用方式:
SessionOptions sessionOptions = new SessionOptions()
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
};
SynchronizeLocalAndFtpDirectory(@"C:'local'mods", "/remote/mods", sessionOptions);
(我是WinSCP的作者)