![]() |
|
|
#16
|
|||
|
|||
|
Майняк спасибо, терь то что надо, ток сканит долго, но эт не важно.
Но проблемы на этом не закончились, мне надо чтоб перебирало ещё диапазон подсетей, тоесть цикл в цикле, вообщем чтоб сначала выполнялся 1ый цикл, как он закончится, выполнялся 2ой, как заканчивается 2ой, дожен переключится заново 1ый, ну вы меня поняли надеюсь=)) Полазил по всяким документациям ненашёл ни чё подобного, надеюсь мне и с этим поможите Последний раз редактировалось Дельфин, 04.08.2006 в 04:37. |
|
#17
|
|||
|
|||
|
Неужели это сложно осуществить или просто не ясен вопрос?
|
|
#18
|
||||
|
||||
|
а как же иначе? Ну, хочешь - берись за сокеты, сам пиши. Может быстрее будет немного.
|
|
#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 ?
Или может есть другой способ? |