【问题标题】:How can I download the oldest file of an FTP server? [duplicate]如何下载 FTP 服务器的最旧文件? [复制]
【发布时间】:2015-07-28 14:35:06
【问题描述】:

如何下​​载 FTP 服务器的最旧文件?

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://192.168.47.1/DocXML");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("Igor", "");

FtpWebResponse response = (FtpWebResponse)request.GetResponse();

Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);

string names = reader.ReadLine();

textBox12.Text = names; 

【问题讨论】:

标签: c# ftp ftp-client


【解决方案1】:

如何下​​载 FTP 服务器的最旧文件?

使用WebRequestMethods.Ftp.ListDirectoryDetails

这将发出一个 FTP LIST 命令,请求在单个请求中获取文件的详细信息。但这并不容易,因为您必须解析这些行,而且它们没有标准格式。

取决于 ftp 服务器,它可能会以如下格式返回行:

08-10-11  12:02PM       <DIR>          Version2
06-25-09  02:41PM            144700153 image34.gif
06-25-09  02:51PM            144700153 updates.txt
11-04-10  02:45PM            144700214 digger.tif

或者

d--x--x--x    2 ftp      ftp          4096 Mar 07  2002 bin
-rw-r--r--    1 ftp      ftp        659450 Jun 15 05:07 TEST.TXT
-rw-r--r--    1 ftp      ftp     101786380 Sep 08  2008 TEST03-05.TXT
drwxrwxr-x    2 ftp      ftp          4096 May 06 12:24 dropoff

甚至是另一种格式。

这篇博文"Sample code for parsing FtpwebRequest response for ListDirectoryDetails" 提供了处理多种格式的示例。

如果您知道格式是什么,只需为其创建一个自定义的最小行解析器。

WebRequestMethods.Ftp.ListDirectoryWebRequestMethods.Ftp.GetDateTimestamp 一起使用

这更容易,但缺点是它需要您提交多个请求才能找出目录条目的最后修改日期。

这将为您提供仅包含名称的文件和目录条目列表,这样更易​​于解析。

public static IEnumerable<string> ListDirectory(string uri, NetworkCredential credentials)
{
    var request = FtpWebRequest.Create(uri);
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    request.Credentials = credentials;
    using (var response = (FtpWebResponse)request.GetResponse())
    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream, true))
    {
        while (!reader.EndOfStream)
            yield return reader.ReadLine();
    }
}

然后对于每个文件,您可以通过对每个文件发出请求来获取最后修改日期:

public static DateTime GetLastModified(string fileUri, NetworkCredential credentials) 
{
    // error checking omitted
    var request = FtpWebRequest.Create(fileUri);
    request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
    request.Credentials = credentials;
    using (var response = (FtpWebResponse)request.GetResponse())
        return response.LastModified;
}

现在您可以简单地执行以下操作来获取文件列表及其最后修改日期。

var credentials = new NetworkCredential("Igor", "");
var filesAndDates = ListDirectory("ftp://192.168.47.1/DocXML", credentials)
    .Select(fileName => new {
        FileName = fileName,
        LastModified = GetLastModified("ftp://192.168.47.1/DocXML/" + fileName, credentials)
    })
    .ToList();
// find the oldest entry.
var oldest = filesAndDates.OrderBy(x => x.LastModified).FirstOrDefault();

【讨论】:

  • 程序给了我两个错误,在ListDirectoryGetLastModified
  • @garci 已修复。我忘了将request 声明为var request =
  • 怎么样???我不明白
  • @garci 我编辑了答案中的代码来解决这个问题,请参阅更新答案中的代码
  • 坦克!还有其他问题,我怎样才能只下载.txt的文件???
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多