如何在FtpWebRequest之前检查FTP是否存在文件


Answers:


116
var request = (FtpWebRequest)WebRequest.Create
    ("ftp://ftp.domain.com/doesntexist.txt");
request.Credentials = new NetworkCredential("user", "pass");
request.Method = WebRequestMethods.Ftp.GetFileSize;

try
{
    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
    FtpWebResponse response = (FtpWebResponse)ex.Response;
    if (response.StatusCode ==
        FtpStatusCode.ActionNotTakenFileUnavailable)
    {
        //Does not exist
    }
}

通常,在这样的代码中对功能使用Exceptions是个坏主意,但是在这种情况下,我认为实用主义是一个胜利。与以这种方式使用异常相比,目录上的呼叫列表可能会导致FAR效率低下。

如果不是,请注意这不是一个好习惯!

编辑:“它对我有用!”

这似乎适用于大多数ftp服务器,但不是全部。某些服务器要求发送“ TYPE I”,然后SIZE命令才能起作用。有人认为应该按以下方式解决问题:

request.UseBinary = true;

不幸的是,这是一个设计限制(很大的错误!),除非FtpWebRequest正在下载或上传文件,否则它将不会发送“ TYPE I”。请参阅此处的讨论和Microsoft的响应。

我建议改用以下WebRequestMethod,它对我测试过的所有服务器都有效,即使那些不会返回文件大小的服务器也是如此。

WebRequestMethods.Ftp.GetDateTimestamp

9

因为

request.Method = WebRequestMethods.Ftp.GetFileSize

在某些情况下可能会失败(550:在ASCII模式下不允许SIZE),您可以只选择Timestamp。

reqFTP.Credentials = new NetworkCredential(inf.LogOn, inf.Password);
reqFTP.UseBinary = true;
reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;

5

FtpWebRequest(.NET中也没有其他任何类)没有任何显式方法来检查FTP服务器上的文件是否存在。您需要滥用诸如GetFileSize或的要求GetDateTimestamp

string url = "ftp://ftp.example.com/remote/path/file.txt";

WebRequest request = WebRequest.Create(url);
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.GetFileSize;
try
{
    request.GetResponse();
    Console.WriteLine("Exists");
}
catch (WebException e)
{
    FtpWebResponse response = (FtpWebResponse)e.Response;
    if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
    {
        Console.WriteLine("Does not exist");
    }
    else
    {
        Console.WriteLine("Error: " + e.Message);
    }
}

如果您想要更直接的代码,请使用一些第三方FTP库。

例如,对于WinSCP .NET程序集,可以使用其Session.FileExists方法

SessionOptions sessionOptions = new SessionOptions {
    Protocol = Protocol.Ftp,
    HostName = "ftp.example.com",
    UserName = "username",
    Password = "password",
};

Session session = new Session();
session.Open(sessionOptions);

if (session.FileExists("/remote/path/file.txt"))
{
    Console.WriteLine("Exists");
}
else
{
    Console.WriteLine("Does not exist");
}

(我是WinSCP的作者)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.