如何在FTP服务器上获取文件的上次修改日期

问题描述 投票:5回答:2

这是我的代码

FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(FTPAddress);
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
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();
}

如你所见,我正在使用ListDirectoryDetails

对于directories中的每一行,这是内容:

ftp://172.28.4.7//12-22-14  01:21PM                 9075 fileName.xml

我的问题是如何从那条线上获得时间?我应该解析字符串吗?我不这么认为,因为我读到有LastModified属性,但我不知道如何使用它。

请问你能帮帮我吗?

c# .net ftp ftpwebrequest
2个回答
7
投票

遗憾的是,使用.NET框架提供的功能,没有真正可靠有效的方法来检索目录中所有文件的修改时间戳,因为它不支持FTP MLSD命令。 MLSD命令以标准化的机器可读格式提供远程目录列表。命令和格式由RFC 3659标准化。

.NET框架支持的替代方案:

  • ListDirectoryDetails方法(FTP LIST命令)检索目录中所有文件的详细信息,然后处理FTP服务器特定格式的详细信息 DOS / Windows格式:C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response * nix格式:Parsing FtpWebRequest ListDirectoryDetails line
  • GetDateTimestamp方法(FTP MDTM命令)单独检索每个文件的时间戳。一个优点是响应由RFC 3659标准化为YYYYMMDDHHMMSS[.sss]。缺点是您必须为每个文件发送单独的请求,这可能是非常低效的。这个方法使用你提到的LastModified propertyconst string uri = "ftp://example.com/remote/path/file.txt"; FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri); request.Method = WebRequestMethods.Ftp.GetDateTimestamp; FtpWebResponse response = (FtpWebResponse)request.GetResponse(); Console.WriteLine("{0} {1}", uri, response.LastModified);

或者,您可以使用支持现代MLSD命令的第三方FTP客户端实现。

例如,WinSCP .NET assembly支持这一点。

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

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

    // Get list of files in the directory
    string remotePath = "/remote/path/";
    RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath);

    foreach (RemoteFileInfo fileInfo in directoryInfo.Files)
    {
        Console.WriteLine("{0} {1}", fileInfo.Name, fileInfo.LastWriteTime);
    }    
}

(我是WinSCP的作者)


0
投票

尝试使用MS文档中的此代码:

  // Get the object used to communicate with the server.
  Uri serverUri = new Uri("ftp://mypath/myfile.txt");
  FtpWebRequest request = (FtpWebRequest)WebRequest.Create (serverUri);
  request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
  FtpWebResponse response = (FtpWebResponse)request.GetResponse ();
  DateTime lastModifiedDate = response.LastModified;

http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse.lastmodified%28v=vs.110%29.aspx

您应该为每个文件执行此操作。要做到这一点,它也不简单。您必须从目录列表响应中解析结果。

检查一下这个人是如何做到的:Extracting file names from WebRequestMethods.Ftp.ListDirectoryDetails你应该能够在读取的每一行上做一个foreach。

© www.soinside.com 2019 - 2024. All rights reserved.