Тема: FTP Search
Показать сообщение отдельно
  #19  
Старый 06.09.2006, 14:23
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
Подмигивание А почему бы не попробовать вот так?

Можно использовать функции из модуля 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 для проверки доступа...
Ответить с цитированием