|
#16
|
|||
|
|||
Майняк спасибо, терь то что надо, ток сканит долго, но эт не важно.
Но проблемы на этом не закончились, мне надо чтоб перебирало ещё диапазон подсетей, тоесть цикл в цикле, вообщем чтоб сначала выполнялся 1ый цикл, как он закончится, выполнялся 2ой, как заканчивается 2ой, дожен переключится заново 1ый, ну вы меня поняли надеюсь=)) Полазил по всяким документациям ненашёл ни чё подобного, надеюсь мне и с этим поможите Последний раз редактировалось Дельфин, 04.08.2006 в 04:37. |
#17
|
|||
|
|||
Неужели это сложно осуществить или просто не ясен вопрос?
|
#18
|
||||
|
||||
а как же иначе? Ну, хочешь - берись за сокеты, сам пиши. Может быстрее будет немного.
SysMan. C++Builder Internet/Intranet Programming. |
#19
|
||||
|
||||
А почему бы не попробовать вот так?
Можно использовать функции из модуля wininet напрямую, в обходвсяких indy и т.д. Например:
// функция разбора строки на элементы по разделителю, понадобится позже Код:
function StrToArrays(const str, r: String; out Temp: TStrings): Boolean; var j: integer; sInStr,sSep: String; begin sInStr := str; sSep := r; if Temp <> nil then begin Temp.Clear; while sInStr <> '' do begin j := Pos(sSep,sInStr); if j = 0 then j := Length(sInStr) + 1; Temp.Add(Copy(sInStr, 1, j-1)); Delete(sInStr, 1, j + length(sSep) - 1); end; Result := True; end else Result := False; end; // функция заливки папки без подпапок на FTP // параметры: // strHost - ftp сервер, куда заливаем // strUser - имя пользователя // strPwd - пароль // Port - номер порта, обычно используют INTERNET_DEFAULT_FTP_PORT // localDir - локальная папка с айлами, которую следует залить на FTP // глобальная переменная sFTPPath содержит в себе путь к папке, куда мы заливаем,если пусто - то льем в корень Код:
function FtpSaveFile(const strHost, strUser, strPwd: String; Port: Integer; localDir: string): Boolean; var hNet,hFTP,hResult : HINTERNET; sSourceDir : String; bSuccess : Boolean; SR : TSearchRec; iProgress, iCount : Integer; sRec : TWin32FindData; saDirs : TStrings; begin Result := False; sSourceDir := IncludeTrailingPathDelimiter(localDir); sFTPPath := StringReplace(sFTPPath,'\','/',[rfReplaceAll]); { Открываем сессию } hNet := InternetOpen('TestSession', // Агент INTERNET_OPEN_TYPE_PRECONFIG, // Тип доступа nil, // ProxyName nil, // ProxyBypass 0); // или INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE { Проверяем валидность хэндла соединения } if hNet = nil then begin ShowMessage('Error'); Exit; end; { Соединяемся с FTP Сервером } hFTP := InternetConnect(hNet, // Хэндл от InternetOpen PChar(strHost), // FTP сервер port, // (INTERNET_DEFAULT_FTP_PORT), PChar(StrUser), // username PChar(strPwd), // password INTERNET_SERVICE_FTP, // FTP, HTTP, или Gopher? 0, // флаг: 0 или INTERNET_FLAG_PASSIVE 0); // Значение CallBack'а if hFTP = nil then begin InternetCloseHandle(hNet); MessageBox(Handle,PChar(Format('Error %s',[strHost])),PChar(Caption),MB_ICONWARNING); Exit; end; if sFTPPath <> '' then begin saDirs := TStringList.Create; StrToArrays(sFTPPath,'/',saDirs); for iCount := 0 to saDirs.Count - 1 do begin FtpCreateDirectory(hFTP,PChar(saDirs.Strings[iCount])); bSuccess := FtpSetCurrentDirectory(hFTP, PChar(saDirs.Strings[iCount])); if not bSuccess then begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); MessageBox(Handle,PChar(Format('Error %s',[saDirs.Strings[iCount])),PChar(Caption),MB_ICONWARNING); Exit; end; end; saDirs.Free; end; if FindFirst(sSourceDir + '*.*', faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin FtpPutFile(hFTP, PChar(sSourceDir + SR.Name), PChar(SR.Name), FTP_TRANSFER_TYPE_BINARY, 0); end; until FindNext(SR) <> 0; FindClose(SR); end; InternetCloseHandle(hFTP); InternetCloseHandle(hNet); Result := True; end; Так вот, можно использовать возвращаемое значение InternetConnect для проверки доступа... |
#20
|
|||
|
|||
А можно какнить ускорить процесс сканирования в случае с IdFTP? Например использованием таймера или Application.ProcessMessages ?
Или может есть другой способ? |