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