无法对 FTP 文件夹使用 GetDateTimestamp

问题描述 投票:0回答:1
  • 我必须将文件复制到特定目录。在复制文件之前,我必须检查该目录是否已存在(如果不存在,则创建一个)。

  • 为了检查目录是否存在,我尝试获取该目录的时间戳。如果该目录存在,我将获取其时间戳,如果不存在,则我将创建一个新目录。

我的接收时间戳的代码

// Try to get the LastModified date of the folder whose existence has to be checked

// Get the object used to communicate with the server.  
string DirectoryPath = "ftp://66.220.9.50/FileDirectory";
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(DirectoryPath));
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
request.Credentials = new NetworkCredential(_username, _password);

//Step-1: This line will decide if the Directory exists or not
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Status-1: " + response.StatusDescription);
Console.WriteLine("Last Modified: " + response.LastModified);

validDirectory = true;
response.Close();

问题:如果我使用另一台 Windows PC 作为 FTP 服务器(使用 FileZilla),上面的代码可以正常工作。但是,如果我尝试使用上述代码从在线 FTP 服务器 (wwww.driveHQ.com) 获取时间戳,则

FtpWebResponse response = (FtpWebResponse)request.GetResponse();
行会抛出异常:

远程服务器返回错误:<550>文件不可用 (例如找不到文件,无法访问)

PS: 我能够连接到服务器(状态代码:150,连接已接受)。我的

Uri
也是正确的(我成功地创建了一个目录)。 仅当我尝试获取此创建的目录的时间戳或尝试获取目录内的文件列表时,问题才会出现。

c# .net ftp ftpwebrequest
1个回答
4
投票

GetDateTimestamp
方法使用下面的FTP
MDTM
命令。

许多 FTP 服务器,包括 IIS 或 DriveHQ,不支持文件夹的

MDTM
命令。


检索修改时间的其他方法是

MLST
命令。但
FtpWebRequest
不支持这一点。您必须使用不同的 FTP 客户端库(例如我的 WinSCP .NET 程序集 及其
Session.GetFileInfo
方法
)。

但这也不会对你有多大帮助。许多服务器根本不支持

MLST
命令(例如 IIS)。 DriveHQ 对
MLST
命令返回格式错误(恕我直言)的响应。虽然它包含修改时间,但不包含文件名,WinSCP 无法解析响应。您必须进行一些粗暴的黑客攻击,例如解析 WinSCP 会话日志文件以从中获取修改时间戳。或者也许另一个第 3 方库将能够应对 DriveHQ 响应。


最后一个选项是完整列出父目录,从列表中检索子目录的时间戳。

虽然这不是一个好的解决方案,但由于

FtpWebRequest
仅支持
LIST
命令,没有标准格式,DriveHQ 使用相对标准的 *nix 格式,因此您可以使用我对 Parsing FtpWebRequest ListDirectoryDetails 的回答线.


虽然您实际上仅使用

GetDateTimestamp
检查文件夹是否存在,但您可以简单地使用
ListDirectory
方法而不是
GetDateTimestamp
。这显然是一种矫枉过正,但它是迄今为止最简单的解决方案,结合了
FtpWebRequest
和 DriveHQ 的限制。

请参阅如何检查 FTP 目录是否存在

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