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

如何下载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; 

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

使用WebRequestMethods.Ftp.ListDirectoryDetails

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

根据ftp服务器,它可能会返回如下格式的行:

 08-10-11 12:02PM  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 

甚至是另一种格式。

此博客文章“用于解析ListDirectoryDe​​tails的FtpwebRequest响应的示例代码”提供了处理多种格式的示例。

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

WebRequestMethods.Ftp.ListDirectoryWebRequestMethods.Ftp.GetDateTimestamp

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

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

 public static IEnumerable 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();