我必须将文件复制到特定目录。在复制文件之前,我必须检查目录是否已经存在(如果没有,则创建一个)。
要检查目录是否存在,我尝试获取该目录的时间戳。如果该目录存在,我将获得其时间戳,如果没有,那么我将创建一个新目录。
我接收时间戳的代码
// Try to get the LastModified date of the folder whose existence has to be checked
// Get the object used to communicate with the server.
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
也是正确的(我能够成功创建目录)。 只有当我尝试获取此创建目录的时间戳或尝试获取目录中的文件列表时才会出现此问题。
答案 0 :(得分:2)
GetDateTimestamp
方法使用下面的FTP MDTM
命令。
许多FTP服务器(包括IIS或DriveHQ)不支持文件夹的MDTM
命令。
检索修改时间的其他方法是MLST
命令。但是FtpWebRequest
不支持。您必须使用其他FTP客户端库(例如我的WinSCP .NET assembly及其Session.GetFileInfo
method)。
但这对你也无济于事。许多服务器根本不支持MLST
命令(例如IIS)。并且DriveHQ返回对MLST
命令的格式错误(imho)响应。虽然它包含修改时间,但它不包含文件名,WinSCP无法解析响应。您将不得不做一些严重的黑客攻击,例如解析WinSCP会话日志文件以获取修改时间戳。或者,也许另一个第三方库将能够应对DriveHQ响应。
最后一个选项是完成父目录的完整列表,从列表中检索子目录的时间戳。
虽然这不是一个好的解决方案,但由于FtpWebRequest
仅支持LIST
命令,没有标准格式,DriveHQ使用相对标准的* nix格式,因此您可以使用我的回答Parsing FtpWebRequest ListDirectoryDetails line。
虽然您实际上只使用GetDateTimestamp
作为文件夹存在的检查,但您只需使用ListDirectory
方法而不是GetDateTimestamp
。这显然是一种矫枉过正,但它是迄今为止最简单的解决方案,具有FtpWebRequest
和DriveHQ的组合限制。