Я написал следующий код, чтобы определить, существует ли каталог. Метод DirectoryExists
принимает либо полный, либо относительный путь.
public bool DirectoryExists(string directory)
{
try
{
FtpWebRequest request = GetRequest(directory);
request.Method = WebRequestMethods.Ftp.ListDirectory;
using (FtpWebResponse response = request.GetResponse() as FtpWebResponse)
using (StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII))
{
sr.ReadToEnd();
}
return true;
}
catch { }
return false;
}
protected FtpWebRequest GetRequest(string filename = "")
{
FtpWebRequest request = WebRequest.Create(_host.GetUrl(filename)) as FtpWebRequest;
request.Credentials = new NetworkCredential(Username, Password);
request.Proxy = null;
request.KeepAlive = false;
return request;
}
Примечание: _host.GetUrl(filename)
возвращает полный путь к указанному каталогу или имени файла. В моем случае это ftp://www.mydomain.com/Articles/controls/precisely-defining-kilobytes-megabytes-and-gigabytes
.
Этот код проработал много месяцев. Но вдруг перестало работать. Теперь в DirectoryExists
не возникает исключения, когда каталог не существует. sr.ReadToEnd()
просто возвращает пустую строку.
Я отправил аналогичный вопрос, и мне было предложено всегда добавлять /
в конец пути. Я пробовал это и думал, что однажды получил исключение, но сейчас это не вызывает исключения.
Я не знаю, изменилось ли поведение на FTP-сервере, с которым я общаюсь, или что. Опять же, это работало нормально, когда я его писал, а теперь нет.
Как я могу определить, существует ли каталог FTP?
РЕДАКТИРОВАТЬ:
Просматривая ответ после вызова ReadToEnd()
, я вижу:
BannerMessage = 220 Служба Microsoft FTP \ r \ n
ContentLength = -1
ExitMessage = 221 До свидания. \ R \ n
StatusCode = ClosingData
StatusDescription = 226 Передача завершена. \ R \ n
WelcomeMessage = 230 Пользователь вошел в систему. \ R \ n
ОБНОВЛЕНИЕ:
В конце концов, я вижу, что большинство людей рекомендуют варианты того, что я делал изначально. Это придало вес предположению Ханса Пассанта о том, что проблема связана с сервером. Я пытаюсь заставить их взглянуть на это, но они кажутся немного сбитыми с толку всей дискуссией. Я знаю, что они используют сервер Microsoft, и сомневаюсь, что смогу получить от них решение.
Если все остальное терпит неудачу, я думаю, что ответ состоит в том, чтобы составить список родительского каталога, что требует некоторой дополнительной работы для обработки таких случаев, как, когда рассматриваемый каталог является корнем, а также случаев, когда родительский каталог не существует.