Здесь я хочу представить исходный код программы по автоматическому скачиванию конкретного файла с фтп сервера, с использованием ini файла, который хранит настройки, программа написана в среде программирования Microsoft Visual Basic v 6.0.
Во-первых, я хочу сказать, что я не профессионал, я просто написал эту программку для удобства у себя на работе, так как мне приходилось обслуживать много компьютеров, которые расположены чуть ли не по всей области, и мне нужно было часто закачивать к ним файлы, поэтому я решил написать программу, которая сама закачивала туда файлы, этого у меня не получилось, и я решил сделать так чтобы программа-клиент (которая расположена удаленно) сама скачивала необходимые файлы. Уже это у меня получилось, и я Вам сейчас примерно покажу, как я ее написал.
Прежде чем переходить непосредственно к коду, давайте я сначала объясню саму инструкцию, которую выполняет программа, как Вы знаете ведь код программы это своего рода инструкция компьютеру, что ему нужно делать. Так вот, программа расположенная удаленно запускается по расписанию с помощью планировщика, подключается к FTP серверу, затем скачивает архив.rar, после того как она скачала, она сразу удаляет его с FTP (чтобы каждый день не качать), затем она отправляет на FTP текстовый файл, как бы лог, для того чтобы я знал, кто скачал этот файл, т.к. пользователей, которые подключаются к фтп много. Затем программа запускает батник, который и делает ту или иную задачу с этим файлом (код батника я показывать не буду, так как это и не нужно). Вот и все что делает моя программа, а забыл сказать, что все, что она делает, пользователь компьютера не видит, выполняется она в скрытом режиме, чтобы не отвлекать того оператора кто работает за компьютером, но Вы можете сделать так, чтобы она выполнялась в видимом режиме.
Ну, теперь давайте перейдем непосредственно к коду программы, но для начала создайте ini файл (test.ini), который должен в последствии, располагается в одной папке с программой, он должен быть с таким содержимым:
[General]
servname=IP FTP сервера
usern=логин
pwd=пароль
port=порт
file=D:\путь к файлу\имя того кто скачал.txt
name= имя того кто скачал.txt
Исходный код программы на Visual Basic
Затем открываем саму среду Microsoft Visual Basic v 6.0 и в код вставляем следующие:
Option Explicit Private Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" _ (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _ (ByVal sAgent As String, ByVal nAccessType As Long, ByVal sProxyName As String, _ ByVal sProxyBypass As String, ByVal nFlags As Long) As Long Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _ (ByVal hInternetSession As Long, ByVal sServerName As String, _ ByVal nServerPort As Integer, ByVal sUserName As String, _ ByVal sPassword As String, ByVal nService As Long, ByVal dwFlags As Long, _ ByVal dwContext As Long) As Long Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _ (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _ ByVal lpszRemoteFile As String, ByVal dwFlags As Long, _ ByVal dwContext As Long) As Boolean Private Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _ (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _ ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, _ ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, _ ByVal dwContext As Long) As Boolean Private Declare Function InternetCloseHandle Lib "wininet.dll" _ (ByVal hInet As Long) As Integer Private Declare Function DeleteFile Lib "kernel32.dll" Alias "DeleteFileA" _ (ByVal lpFileName As String) As Long Dim rc& Dim rs& Private Sub Form_Load() Dim retval As Long Dim WinRarApp As String Dim iPath As String Dim iArhivName As String Dim adr As String rc& = InternetOpen("", 0, vbNullString, vbNullString, 0) rs& = InternetConnect(rc&, ReadIni("General", "servname"), "0", _ ReadIni("General", "usern"), ReadIni("General", "pwd"), 1, 0, 0) If FtpGetFile(rs&, "архив.rar", "d:\путь\архив.rar", False, 0, 1, 0) = False Then End Call InternetCloseHandle(rs&) Call InternetCloseHandle(rc&) rc& = InternetOpen("", 0, vbNullString, vbNullString, 0) rs& = InternetConnect(rc&, ReadIni("General", "servname"), "0", _ ReadIni("General", "usern"), ReadIni("General", "pwd"), 1, 0, 0) FtpDeleteFile rs&, "архив.rar" If FtpPutFile(rs&, ReadIni("General", "file"), _ ReadIni("General", "name"), 1, 0) = False Then End Shell "D:\путь к батнику\имя батника.bat", vbHide End End Sub
Это еще не все, необходимо еще добавить модуль со следующим содержанием:
Private Declare Function WritePrivateProfileString Lib _ "kernel32" Alias "WritePrivateProfileStringA" _ (ByVal lpApplicationName As String, ByVal lpKeyName As String, _ ByVal lpString As String, ByVal lpFileName As String) As Long Private Declare Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, ByVal lpDefault As String, _ ByVal lpReturnedString As String, ByVal nSize As Long, _ ByVal lpFileName As String) As Long Public Sub SaveIni(Razdel As String, Param, znach) Call WritePrivateProfileString(Razdel, Param, znach, App.Path & "\test.ini") End Sub Public Function ReadIni(Razdel As String, Param) As String ReadIni = GetValue(Razdel, Param, App.Path & "\test.ini", "0") End Function Private Function GetValue(ByVal Section As String, ByVal Key As String, _ ByVal fFileName As String, _ Optional ByVal DefaultValue As String = vbNullString) As String Dim Data As String Data = String$(1000, Chr$(0)) If GetPrivateProfileString(Section, Key, DefaultValue, Data, 1000, fFileName) > 0 Then GetValue = Left$(Data, InStr(Data$, Chr$(0)) - 1) Else GetValue = DefaultValue End If Exit Function End Function
Теперь примерно объясню, что это значит. Все что идет между Option Explicit и Private Sub Form_Load() это объявление API функций которые мы используем. Затем идет код самой формы, в которой и используются эти API функции. В коде формы мы сначала выделяем память для переменных, потом уже идет непосредственно подключение к фтп, скачивание файла, удаление файла, отправка текстового файла и запуск батника. А код модуля нужен для того, чтобы наша программа могла быть привязана к ini файлу, и считывать из него параметры.
Вот и все что я хотел показать, программа конечно не профессиональная, но кому-нибудь этот исходный код может пригодиться.