1

Тема: VBScript: работа с протоколом FTP с помощью компонента Chilkat FTP

Бесплатный COM-сервер Chilkat FTP позволяет:
  * копировать файлы с/на ftp-сервер;
  * копировать файлы с/на ftp-сервер непосредственно из памяти;
  * создать каталоги, переименовать/удалить файлы/каталоги на ftp-сервере;
  * получить листинг каталога на ftp-сервере в виде XML;
  * работать с протоколом FTP в пассивном режиме.

Компонент доступен для скачивания на этой странице. Прямая ссылка. Дистрибутив (инсталлятор) имеет размер около 700 Кб. Примеры работы с компонентом можно найти здесь, правда, только для платной версии компонента (платная и бесплатная версии по функционалу похожи).

Простейший пример закачки файла на FTP:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.host.ru"
oFtp.Username = "vasya"
oFtp.Password = "passw"
res = oFtp.Connect()
If (res <> 1) Then
    WScript.Echo oFtp.LastErrorText
    WScript.Quit
End If
res = oFtp.ChangeRemoteDir("WWW")
If (res <> 1) Then
    WScript.Echo oFtp.LastErrorText
    WScript.Quit
End If
localFilename = "C:\Temp\test.jpg"
remoteFilename = "test.jpg"
res = oFtp.PutFile(localFilename, remoteFilename)
If (res <> 1) Then
    WScript.Echo oFtp.LastErrorText
    WScript.Quit
End If
oFtp.Disconnect

Простейший пример скачивания файла с FTP, полностью аналогичен предыдущему, отличается только одним методом:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.host.ru"
oFtp.Username = "vasya"
oFtp.Password = "passw"
res = oFtp.Connect()
If (res <> 1) Then
    WScript.Echo oFtp.LastErrorText
    WScript.Quit
End If
res = oFtp.ChangeRemoteDir("WWW")
If (res <> 1) Then
    WScript.Echo oFtp.LastErrorText
    WScript.Quit
End If
localFilename = "C:\Temp\test.jpg"
remoteFilename = "test.jpg"
res = oFtp.GetFile(remoteFilename, localFilename)
If (res <> 1) Then
    WScript.Echo oFtp.LastErrorText
    WScript.Quit
End If
oFtp.Disconnect
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: работа с протоколом FTP с помощью компонента Chilkat FTP

Более развёрнутый пример получения одного файла с FTP-сервера. Сравнивается дата/время; скачивается, только если разница больше минуты (основные типы серверов отдают время с точностью до минуты) и удалённый файл более новый. Проверяется доступное место на диске и отражается прогресс скачивания в процентах.
Проверялось на серверах:
* Microsoft IIS 5.0, 5.1, 6.0;
* FileZilla Server 0.9.28;
* freeFTPd 1.0.11.0.

Option Explicit

Dim objFTP
Dim objFSO

Dim strRemoteFullFileName
Dim strLocalPath

Dim strRemotePath
Dim strRemoteFileName
Dim strLocalFullFileName
Dim strTempFileName

' Полный путь к удалённому файлу
strRemoteFullFileName = "/ResKit/win2000/sysdiff.zip"
' Путь к локальной папке
strLocalPath          = "c:\temp\"

Set objFTP = WScript.CreateObject("ChilkatFtp.ChilkatFtp", "FTP_")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

strRemotePath        = objFSO.GetParentFolderName(strRemoteFullFileName)
strRemoteFileName    = objFSO.GetFileName(strRemoteFullFileName)

strLocalFullFileName = objFSO.BuildPath(strLocalPath, strRemoteFileName)
strTempFileName      = strRemoteFileName & ".tmp"


With objFTP
    .Hostname = "ftp.microsoft.com"
    .Username = "" ' anonymous
    .Password = "" ' empty password
    
    .Connect
    
    If .IsConnected Then
        ' Если ftp-сервер не поддерживает CWD по полному имени,
        ' нужно делить путь на отдельные каталоги и делать отдельные переходы по каждому
        .ChangeRemoteDir strRemotePath
        
        .ListPattern = strRemoteFileName
        
        If .NumFilesAndDirs <> 0 Then
            WScript.Echo "Remote [" & strRemoteFullFileName & "]"
            WScript.Echo "    DateLastModified: ", .GetLastModifiedTime(0)
            WScript.Echo "    DateCreated:      ", .GetCreateTime(0)
            WScript.Echo "    DateLastAccessed: ", .GetLastAccessTime(0)
            WScript.Echo
            If objFSO.FileExists(strLocalFullFileName) Then
                WScript.Echo "Locale [" & strLocalFullFileName & "]"
                WScript.Echo "    DateLastModified: ", objFSO.GetFile(strLocalFullFileName).DateLastModified
                WScript.Echo "    DateCreated:      ", objFSO.GetFile(strLocalFullFileName).DateCreated
                WScript.Echo "    DateLastAccessed: ", objFSO.GetFile(strLocalFullFileName).DateLastAccessed
                WScript.Echo
                
                If DateDiff("n", .GetLastModifiedTime(0), objFSO.GetFile(strLocalFullFileName).DateLastModified) < -1 Then
                    objFSO.GetFile(strLocalFullFileName).Name = strTempFileName
                    
                    If DownloadFile(objFTP, strRemoteFileName, strLocalFullFileName) Then
                        objFSO.GetFile(objFSO.BuildPath(strLocalPath, strTempFileName)).Delete True
                    Else
                        objFSO.GetFile(objFSO.BuildPath(strLocalPath, strTempFileName)).Name = strRemoteFileName
                    End If
                Else
                    WScript.Echo "Nothing to do: property DateLastModified of local file [" & strLocalFullFileName & "] " & _
                        " is newer or equal then remote file [" & strRemoteFullFileName & "]."
                End If
            Else
                If DownloadFile(objFTP, strRemoteFileName, strLocalFullFileName) Then
                    
                Else
                    
                End If
            End If
        Else
            WScript.Echo "Not found remote file [" & strRemoteFullFileName & "]."
        End If
        
        .Disconnect
    Else
        WScript.Echo "Can't connect to [" & .Hostname & "]."
    End If
End With

Set objFSO = Nothing
Set objFTP = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function DownloadFile(objFTP, strRemote, strLocal)
    If objFSO.GetDrive(objFSO.GetDriveName(strLocal)).FreeSpace > objFTP.GetSize(0) Then
        If objFTP.GetFile(strRemote, strLocal) Then
            If objFSO.FileExists(strLocal) Then
                WScript.Echo "Success get remote file [" & strRemoteFullFileName & "] " & _
                    "to local file [" & strLocalFullFileName & "]."
                DownloadFile = True
            Else
                WScript.Echo "Failure get remote file [" & strRemoteFullFileName & "] " & _
                    "to local file [" & strLocalFullFileName & "]."
                DownloadFile = False
            End If
        Else
            DownloadFile = False
        End If
    Else
        WScript.Echo "Need more space on local drive [" & objFSO.GetDriveName(strLocal) & "]."
        DownloadFile = False
    End If
End Function
'=============================================================================

'=============================================================================
Sub FTP_GetProgress(intPercent)
    WScript.Echo "Progress: " & CStr(intPercent) & "%"
End Sub
'=============================================================================

Автор примера — alexii.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: VBScript: работа с протоколом FTP с помощью компонента Chilkat FTP

Режим передачи данных по умолчанию является "Активным", в противоположность "Пассивному". Вы можете изменить его на Пассивный, устанавливая свойство Passive COM-сервера в единицу.

Свойство Port COM-сервера позволяет указать числовое значение порта FTP-сервера (например, 21).

Создание файла на FTP из текстовой переменной:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.server.ru"
oFtp.Username = "vasya"
oFtp.Password = "passwd"
oFtp.Connect()
oFtp.ChangeRemoteDir("WWW")
remoteFilename = "test.html"
oFtp.PutFileFromTextData remoteFilename, "<h1>Текст заголовка</h1>"
oFtp.Disconnect

Получение содержимого текстового файла с FTP:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.server.ru"
oFtp.Username = "vasya"
oFtp.Password = "passw"
oFtp.Connect()
oFtp.ChangeRemoteDir("WWW")
remoteFilename = "test.html"
fileContents = oFtp.GetRemoteFileTextData(remoteFilename)
oFtp.Disconnect
If fileContents = vbNullString Then
    WScript.Echo "файл не найден"
Else
    WScript.Echo fileContents
End If

Получение списка файлов в каталоге:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.microsoft.com"
oFtp.Username = ""
oFtp.Password = ""
oFtp.Connect()
oFtp.ChangeRemoteDir "ResKit/y2kfix/"
oFtp.ListPattern = "*"
n = oFtp.NumFilesAndDirs
If n > 0 Then
    For i = 0 To n - 1
        name = oFtp.GetFilename(i)
        size = oFtp.GetSize(i) ' в байтах
        If (oFtp.GetIsDirectory(i) = 1) Then
            dir = "sub-directory"
        Else
            dir = "file"
        End If
        createt = oFtp.GetCreateTime(i)
        last = oFtp.GetLastAccessTime(i)
        modt = oFtp.GetLastModifiedTime(i)
        WScript.Echo name, size, dir, createt, last, modt
    Next
End If
oFtp.Disconnect
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

Re: VBScript: работа с протоколом FTP с помощью компонента Chilkat FTP

Создание каталога на FTP:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "host.name.ru"
oFtp.Username = "vasya"
oFtp.Password = "passw"
oFtp.Connect()
oFtp.ChangeRemoteDir "WWW"
oFtp.CreateRemoteDir("newDirName")
oFtp.Disconnect

Удаление каталога производится полностью аналогично, методом RemoveRemoteDir("dirName").
Переименование файла производится методом RenameRemoteFile(existingFilename, newFilename).
Удаление файла производится методом DeleteRemoteFile(existingFilename).
Свойство Version позволяет узнать версию COM-сервера.
Свойство COM-сервера IsConnected равно 1, если есть подключение к FTP-серверу.
Получение листинга FTP-каталога в формате XML:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.microsoft.com"
oFtp.Username = ""
oFtp.Password = ""
oFtp.Connect()
oFtp.ChangeRemoteDir "ResKit/y2kfix/"
WScript.Echo oFtp.GetCurrentRemoteDir()
WScript.Echo oFtp.GetCurrentDirListing("*")
oFtp.Disconnect

Пример скачивания файлов с FTP по маске:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.microsoft.com"
oFtp.Username = ""
oFtp.Password = ""
oFtp.Connect()
oFtp.ChangeRemoteDir "ResKit/y2kfix/"
numFilesDownloaded = oFtp.MGetFiles("*.txt", "c:/temp")
WScript.Echo "закачано файлов - " & numFilesDownloaded
oFtp.Disconnect
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

Re: VBScript: работа с протоколом FTP с помощью компонента Chilkat FTP

Пример закачивания файлов на FTP по маске:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.domain.ru"
oFtp.Username = "vasya"
oFtp.Password = "passw"
oFtp.Connect()
oFtp.ChangeRemoteDir "WWW"
numFilesUploaded = oFtp.MPutFiles("c:/temp/*.txt")
WScript.Echo "закачано файлов - " & numFilesUploaded
oFtp.Disconnect

Пример удаления файлов на FTP по маске:

Set oFtp = CreateObject("ChilkatFTP.ChilkatFTP")
oFtp.Hostname = "ftp.domain.ru"
oFtp.Username = "vasya"
oFtp.Password = "passw"
oFtp.Connect()
oFtp.ChangeRemoteDir "WWW"
numDeleted = oFtp.DeleteMatching("*.txt")
WScript.Echo "удалено файлов - " & numDeleted
oFtp.Disconnect
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.