在c#中,是否有可能检查某个FTP文件夹中的文件并上传不在那里的文件?

本文关键字:文件 在那里 文件夹 FTP 是否 有可能 检查 | 更新日期: 2023-09-27 18:15:30

我想写一个c#:

  1. 使用用户名和密码访问FTP
  2. 转到某个文件夹
  3. 查看我PC文件夹中没有的文件并上传它们。

我的想法:我的电脑里有一个名为"mods"的文件夹,FTP里有另一个名为"mods"的文件夹,所以我不想打开"FileZilla"软件,而是想写一个c#连接到FTP,检查哪些文件不在那里。

非常感谢!

在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的作者)