Работа с FTP протоколом на Visual Basic (исходники)Источник: CODENET Перевод статьи Joacim Andersson "Using FTP in VB" (Работа с FTP протоколом на Visual Basic)
В моей последней разработке нужно было использовать функции работы с FTP. Сначала для этой цели я использовал Internet Transfer Controls, но вскоре понял, что этот компонент заточен более на работу с Http. У ITC были проблемы с серверами, на которых было установлено не Микрософтовское ПО (ну, например Apache). Тогда я решил написать собственный FTP компонент в виде класса (совокупности объектов или функций в группе по их свойству и поведению). После часов поиска в MSDN я обнаружил очень интересные функции FtpPutFile, FtpGetFile, FtpCreateDirectory. Работа этих функций становилась возможной при получении данных (хендла) от функции InternetConnect, которая используется для обращения к определенным портам адреса (IP). Но и ей нужна информация от функции InternetOpen. Таким образом, для использования каких-либо FTP команд необходимо последовательно вызвать эти функции. При завершении работы нужно вызвать функцию InternetCloseHandle два раза, чтобы закрыть FTP и Internet сессии. Правильная последовательность функций:
Пожалуй, настало время подтвердить теоретическую часть статьи примерами. Для начала самое основное - функция FTPGetFile для получения файла от сервера. Вот так эта функция объявляется:
Как я уже писал, нам понадобятся функции InternetOpen и InternetConnect. Они объявляются так:
Рассмотрим каждый из четырех шагов в отдельности. Шаг первый: Подключение к Интернет
Первый параметр (sAgent) указывает на имя программы, которая вызывает функцию. Видимо, здесь можно писать все, что угодно. Второй параметр (nAccessType) может принимать всего три значения - 0,1 и 3. Он определяет, используем ли мы прокси или нет. При значении равном 1 мы коннектимся напрямую. При 3-х мы используем прокси. При этом адрес прокси нужно задать в параметре sProxyName и порт в параметре sProxyBypass. В данном примере для соединения я установил значение 0, при котором функция берет всю информацию из реестра (то есть использует настройки IE). Т.к. мы не определяем прокси-сервер напрямую, то третий и четвертый параметры принимают значение vbNullString. Последний параметр dwFlags определяет работу функции. Ничего нестандартного в этом случае нам не требуется, поэтому просто ставим 0. Если вызов функции прошел удачно, то переменной hINetSession присвоится ненулевое значение, представляющее собой хендл функции, который мы используем чуть позже. Шаг второй: производим коннект
Первый параметр InternetConnect представляет собой хендл, полученный при выполнении InternetOpen. Второй - урл или Ip хоста, к которому мы присоединяемся (при этом ftp:// опускается). Следующим параметром идет порт. Я выставил значение порта равное 21, но если вы поставите 0, то ничего страшного не произойдет. Просто программа будет коннектиться через порт по умолчанию (как раз 21). Далее мы передаем логин и пароль. Будьте осторожны! При дизассмеблировании все ваши пароли могут попасть в руки особо старательных крякеров. Следующим параметром мы определяем тип используемого сервиса. Я использовал зарезервированную константу INTERNET_SERVICE_FTP, которая имеет значение 1. Также могут быть использованы следующие значения:
Сейчас нас интересует только FTP. Если выставить 0, то функция сама определит, что нам требуется. В этом случае в параметре sServerName следует указать полный урл (ftp://ftp.pesh.com) Параметр dwFlags мы могли установить на &H8000000 (или INTERNET_FLAG_PASSIVE), если бы нам потребовалось работать в FTP в пассивном режиме. Здесь мы просто пишем 0. Последний параметр dwContext определяет необходимость возврата функцией значений. Нам это не нужно, поэтому 0. Шаг третий: вызов FTP функций (например, FTPGetFile)Сначала мы объявим эту функцию:
Потом нам остается только вызвать ее:
Первым идет хендл от функции InternetConnect. Далее имя (или полный путь) до файла на удаленном сервере. Третий параметр - путь до места назначения. Параметр №4 fFailExists определяет, как будет вести себя программа, если она обнаружит, что файл с таким именем уже существует. Значение false указывает на то, что такие файлы будут перезаписываться. Атрибуты, присваиваемые локальному файлу, задаются в параметре dwFlagAttributes. Это можно сделать и после. За формат передачи данных отвечает параметр dwFlags: ASCII = 1, Binary = 2. Последний параметр также отвечает за возврат значений. Пункт четвертый, заключительный: закрываем хендлыХендлы закрываются в порядке, противоположном их открытию. Сначала закроем hSession, а потом InetSession. Для этого используем функцию InternetCloseHandle.
Так она вызывается:
Готово! Мы скачали файл. Теперь разберемся с другими функциями. Для отправки файла на сервер выполняем шаги 1 и 2 и вызываем функцию FTPPutFile, которая выглядит так:
Как видите, очень похоже на FTPGetFile. Сначала идет хендл от InternetConnect, путь и имя локального и "удаленного" файлов. Параметр dwFlags задает тип передачи ASCII = 1, Binary = 2; последний аргумент опускаем.
Вызов функции может оказаться неуспешным, если у пользователя нет прав закачивать файлы на сервер. УДАЛЯЕМ ФАЙЛ
Здесь просто выставляем хендл и имя удаляемого файла. Опять может не сработать при отсутствии прав на удаление. ПЕРЕИМЕНОВАНИЕ
Снова требуется только хендл и имена файлов(старое и новое) ПОЛУЧАЕМ СПИСОК ФАЙЛОВ и ДИРЕКТОРИЙ НА СЕРВЕРЕ Как вы могли заметить, все вышеописанные функции очень просты. Вот пример посложнее. Значения функции могут выводится в Листбокс или его аналог. Нам потребуются две функции FtpFindFirstFile и InternetFindNextFile:
Эти функции возвращают ненулевое значение при обнаружении файла и 0, если произошла ошибка. Для того чтобы определить реальная ли это ошибка или просто больше нет файлов нужно, проверить значение Err.LastDllError. Если оно равно ERROR_NO_MORE_FILES (=18), то все нормально, если нет, то дело наше плохо. Обе этих функции имеют параметр WIN32_FIND_DATA, который представляет собой тип или структуру, определяемую юзером.
Подструктура FILENAME:
Далее я привожу пример заполнения ListBox файлами и директориями с сервера. Считаем, что вы уже получили FTP хендл c именем hSession.
ЗаключениеКак вы видите, описывать FTP функции очень просто. Конечно, есть ещё много разных функций, типа создания директории, но их также легко написать, главное не забывайте закрывать хендлы. |