Помогите написать FTP-клиент.
Спасите!
А что это за контрол inet? У меня вот тоже проблемы с FTP. Раскажы о нем плииз.
просто увидел его на панели компонентов. Но если у тебя проблемы с FTP, то ты можешь писать используя API-Функции. Поскольку проблему с FTP я решил вот код. [COLOR="DarkRed"]ТОЛЬКО КОЕ-ЧТО Тебе придётся переписать и дописать.[/COLOR] Код запиши в модуль
Public Const INTERNET_SERVICE_FTP = 1
Public Const INTERNET_SERVICE_GOPHER = 2
Public Const INTERNET_SERVICE_HTTP = 3
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * 260
cAlternate As String * 14
End Type
Public hINetSession As Variant
Public hSession As Variant
Public 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
Public 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
Public 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
Public Declare Function InternetCloseHandle _
Lib "wininet.dll" (ByVal hInet As Long) As Integer
Public 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
Public Declare Function FtpDeleteFile _
Lib "wininet.dll" Alias "FtpDeleteFileA" ( _
ByVal hFtpSession As Long, _
ByVal lpszFileName As String) As Boolean
Public Declare Function FtpRenameFile _
Lib "wininet.dll" Alias "FtpRenameFileA" ( _
ByVal hFtpSession As Long, _
ByVal lpszExisting As String, _
ByVal lpszNewName As String) As Boolean
Public Declare Function FtpFindFirstFile _
Lib "wininet.dll" Alias "FtpFindFirstFileA" ( _
ByVal hFtpSession As Long, _
ByVal lpszSearchFile As String, _
ByRef lpFindFileData As WIN32_FIND_DATA, _
ByVal dwFlags As Long, _
ByVal dwContent As Long) As Long
Public Declare Function InternetFindNextFile _
Lib "wininet.dll" Alias "InternetFindNextFileA" ( _
ByVal hFind As Long, ByRef lpvFindData As WIN32_FIND_DATA) As Long
Public Sub addMESSAGE(strMES As String)
Form1.MES.Text = Form1.MES.Text & strMES & Chr(13) & Chr(10)
End Sub
Public Sub ListFiles()
Dim hFile As Long 'This is a file handle
Dim fd As WIN32_FIND_DATA
hFile = FtpFindFirstFile(hSession, "*.*", fd, 0, 0)
If hFile = 0 Then
If Err.LastDllError = ERROR_NO_MORE_FILES Then
addMESSAGE ">> Все файлы найдены."
Exit Sub
Else
addMESSAGE ">> Произошёл сбой."
Exit Sub
End If
End If
Do
list1.additem fd.cFileName
Loop While InternetFindNextFile(hFile, fd) <> 0
'Close the file handle
Call InternetCloseHandle(hFile)
End Sub
Public Sub GUListFiles(dir As String)
Dim hFile As Long 'This is a file handle
Dim fd As WIN32_FIND_DATA
hFile = FtpFindFirstFile(hSession, dir & "*.*", fd, 0, 0)
If hFile = 0 Then
If Err.LastDllError = ERROR_NO_MORE_FILES Then
addMESSAGE ">> Все файлы найдены."
Exit Sub
Else
addMESSAGE ">> Произошёл сбой."
Exit Sub
End If
End If
Form1.List1.Clear
Do
list1.additem fd.cFileName
Loop While InternetFindNextFile(hFile, fd) <> 0
'Close the file handle
Call InternetCloseHandle(hFile)
End Sub
Public Sub adddir(dir As String)
Form1.Text1.Text = Form1.Text1 & dir & "/"
End Sub
ЗЫ Никак не могу найти хоть какую нибудь инфу о WinInet в MSDN чтиве.
ЗЗЫ А у меня на панели компонентов нет никакого INETa:(
:confused: Крайне странно, лично я использую тип проекта VB Pro Edition Control. Может ты запускал Standart EXE
Используя TCP соединение сначала реализовал ФТП протокол.
Все отлично работает только вот проблема. Иногда если качать конец файла (из 1гига последние 10Мегов, исползуя комманду REST startbyte) качается не до канца. Не 10мегов а 9.7Мега предположим. Дело в том что барсик не успевает сохранять инфу с такой скоростью с какой ее шлет сервак. Раньше при каждом приходе пакета производились грамозкие вычисления и потери были до нескольких мегабайт. Щаз пара десятков килобайт нехватает до канца файла. Как можно исправить? Куда девается инфа. Может можно замедлить передачу инфы? темиже АПИ функциями.
И еще формат листинга файлов приходящий по команде LIST от разных серверов почемуто разный. Есть ли денибуть инфа об этом.
Спасибо.
Ответ на него я еще не нашел :(.
А насчет листов, то существуют два их типа: Unix и Windows подобные (см. в IIS свойства FTP узла, вкладка "Домашний каталог")
кстати, тоже все поисковики облазил, ища информацию про Inet1(не помню полное название, лень васик запускать), а нашёл код как у PAVEL BASICa.
Вычисли сколько не хватает и ещё раз скомандуй REST startbyte. Поставь цикл While, пока не совпадёт то, сколько есть и сколько надо.