В данной статье мы рассмотрим проблему загрузки файлов с удаленного FTP-сервера в Delphi с использованием компонента TIdFTP.Get. При попытке загрузить файл, TIdFTP выдает ошибку "Can't open : No such file or directory". Мы разберемся, как правильно указать путь к файлу на удаленном сервере, чтобы загрузка прошла успешно.
Описание проблемы
Разработчик пытается загрузить файл ssleay32.dll с удаленного сервера, где у него есть аккаунт, используя TIdFTP.Get (версия 10). Файл существует в папке на сервере, и разработчик может подключиться к серверу с помощью TIdFTP. Однако, независимо от того, как он указывает путь к файлу, TIdFTP.Get выдает ошибку "Can't open : No such file or directory".
Разработчик пытался менять директорию перед загрузкой файла, но также получал ту же ошибку. При подключении к серверу с помощью FileZilla с теми же учетными данными, путь к папке отображается как /MAMbase. Разработчик пытался указать путь к файлу различными способами (/MAMbase, ../MAMbase, ./MAMbase, /MAMbase/, и другие варианты), но без успеха.
Пример кода
Ниже представлен код, который разработчик использует для загрузки файла с удаленного сервера:
if (not fileexists(pathToCommonFiles + 'libeay32.dll')) or (not fileexists(pathToCommonFiles + 'ssleay32.dll')) then
begin
try
try
IdFTP1.Connect;
IdFTP1.Get('./MAMbase/ssleay32.dll', pathToCommonFiles + 'ssleay32.dll', true);
except on E: Exception do
showmessage('Could not make ftp connection for SSL files' + slinebreak +
'Exception class name = ' + E.ClassName + slinebreak +
'Exception message = ' + E.Message);
end;
finally
IdFTP1.quit;
end;
end;
Подтвержденное решение
Первое, что нужно сделать, это подготовить локальные имена файлов заранее:
Затем, один из следующих вариантов должен работать:
if (not FileExists(LocalLibeayFile)) or (not FileExists(LocalSsleayFile)) then
begin
...
IdFTP1.ChangeDir('/MAMbase');
IdFTP1.Get('libeay32.dll', LocalLibeayFile, True);
IdFTP1.Get('ssleay32.dll', LocalSsleayFile, True);
...
end;
Или:
if (not FileExists(LocalLibeayFile)) or (not FileExists(LocalSsleayFile)) then
begin
...
IdFTP1.Get('/MAMbase/libeay32.dll', LocalLibeayFile, True);
IdFTP1.Get('/MAMbase/ssleay32.dll', LocalSsleayFile, True);
...
end;
Если сервер помещает вас в папку / изначально, вы можете опустить ведущий /:
Если вы все еще получаете ошибку, вам нужно определить, откуда она исходит - с FTP-сервера или с локальной машины. Какой тип исключения фактически вызывается? Если это EIdReplyRFCError, ошибка исходит от FTP-сервера. В противном случае, ошибка исходит с локальной машины.
Альтернативное решение
В качестве альтернативного решения вы можете попробовать изменить директорию на сервере перед загрузкой файла, как показано ниже:
Обратите внимание, что в данном случае путь к папке на сервере может отличаться от того, что отображается в FileZilla. В зависимости от конфигурации сервера, вам может потребоваться использовать другой путь для изменения директории.
Заключение
В данной статье мы рассмотрели проблему загрузки файлов с удаленного FTP-сервера в Delphi с использованием TIdFTP.Get и предложили решение, которое должно помочь вам успешно загрузить файлы с сервера. Важно правильно указать путь к файлу на сервере и учитывать особенности работы с FTP-сервером.
В данной статье рассматривается проблема загрузки файлов с удаленного FTP-сервера в Delphi с использованием компонента TIdFTP.Get и способы её решения. При попытке загрузить файл, TIdFTP выдает ошибку 'Can't open : No such file or directory', однако после
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS