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
}
}
Как правило, это плохая идея использовать исключения для функциональности в вашем коде, как это, но в этом случае я считаю, что это победа для прагматизма. Список вызовов в каталоге может быть FAR более неэффективным, чем использование исключений таким образом.
Если нет, просто знайте, что это не очень хорошая практика!
РЕДАКТИРОВАТЬ: "Это работает для меня!"
Это работает на большинстве ftp-серверов, но не на всех. Некоторые серверы требуют отправки «TYPE I», прежде чем команда SIZE будет работать. Казалось бы, проблему нужно решить следующим образом:
request.UseBinary = true;
К сожалению, это конструктивное ограничение (большая полная ошибка!), Что если FtpWebRequest не загружает или не загружает файл, он НЕ будет отправлять «ТИП I». Смотрите обсуждение и ответ Microsoft здесь .
Я бы порекомендовал использовать следующий WebRequestMethod, он работает для меня на всех протестированных мной серверах, даже на тех, которые не возвращают размер файла.
WebRequestMethods.Ftp.GetDateTimestamp