Невозможно использовать GetDateTimestamp для FTP-папки

  • Мне нужно скопировать файлы в конкретный каталог. Прежде чем копировать файлы, я должен проверить, существует ли каталог (если нет, то создать).

  • Чтобы проверить существование каталога, я пытаюсь получить временную метку этого каталога. Если каталог существует, тогда я получу его временную метку, а если нет, то создам новый каталог.

Мой код для получения метки времени

// 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 в качестве FTP-сервера (используя FileZilla). Но если я попытаюсь получить отметку времени с использованием вышеуказанного кода с онлайн-FTP-сервера ( wwww.driveHQ.com ), тогда строка FtpWebResponse response = (FtpWebResponse)request.GetResponse();выдает исключение:

Удаленный сервер возвратил ошибку: <550> Файл недоступен (например, файл не найден, нет доступа)

PS: Я могу подключиться к серверу (получил код состояния: 150, Connection Accepted). Я Uriтакже прав (я успешно могу создать каталог). Проблема возникает, только если я попытаюсь получить временную метку этого созданного каталога или попытаюсь получить GetDateTimestamp файлов внутри каталога.

c#,.net,ftp,ftpwebrequest,

3

Ответов: 1


2 принят

MDTMМетод использует FTP - MDTMкоманду внизу.

Многие FTP-серверы, включая IIS или DriveHQ, не поддерживают MLSTкоманду для папок.


Другой способ получить время модификации - это FtpWebRequestкоманда. Но это не поддерживается Session.GetFileInfo. Вам нужно будет использовать другую клиентскую библиотеку FTP (например, мою сборку WinSCP .NET и ее MLSTметод ).

Но это тоже не поможет. Многие серверы вообще не поддерживают эту MLSTкоманду (например, IIS). И DriveHQ возвращает неверный ответ (imho) на FtpWebRequestкоманду. Хотя он содержит время модификации, он не содержит имени файла, а WinSCP не выполняет синтаксический анализ ответа. Вам нужно будет сделать грубый взлом, например, разбить файл журнала сеансов WinSCP, чтобы получить из него временную метку изменения. Или, возможно, другая сторонняя библиотека сможет справиться с ответом DriveHQ.


Последний вариант - сделать полный список родительского каталога, извлекая временную метку подкаталога из списка.

Хотя это нехорошее решение является общим, так как LISTподдерживается только LISTкоманда, что не имеет стандартного формата, DriveHQ использует относительно стандартный формат * nix, поэтому вы можете, например, использовать мой ответ для строки Parsing GetDateTimestamp ListDirectoryDetails .


Хотя, поскольку вы на самом деле используете GetDateTimestampтолько проверку на существование папки, вы можете просто использовать этот ListDirectoryметод вместо FtpWebRequest. Очевидно, это перебор, но это самое простое решение с комбинированными ограничениями FtpWebRequestи DriveHQ.

См. Как проверить, существует ли FTP-каталог .

C # ,. сети, FTP, FtpWebRequest,
Похожие вопросы