Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
21.05.2012, 11:47:00
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  Internet / LAN Forum
| | |-+  ftp download
« vorheriges nächstes »
Seiten: [1] Drucken
Autor Thema: ftp download  (Gelesen 1912 mal)
Lightning
Hero Member
*****
Offline Offline

Beiträge: 670

100856543
WWW
« am: 16.03.2002, 15:12:40 »

ich hab mir nen kleinen downloadmanager geschrieben, bisher funzt auch alles wunderbar, jetz will ich aber nen ftp download machen, naja aber mit der procedure geht das nicht.

Code:
function DownloadFile(SourceFile, DestFile: String): Boolean;

begin

try

Result := URLDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;

except

Result := False;

end;

end;


und dann beim aufruf:

Code:
DownloadFile(ListBox1.Items.Strings[0], ListBox2.Items.Strings[0]);



wie sage ich meinem kleinen manager, er soll auch ftp laden?
Gespeichert

Lightning is my name, the night is my element, I'm full of energy, I am energy
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #1 am: 16.03.2002, 17:52:06 »

Hallo,

In der WinInet unit gibt's Funktionen für den Download von einem Ftp-Server:

InternetOpen
FtpOpenFile
InternetConnect
FtpOpenFile
InternetReadFile
usw.

Hier eine Beispiel Komponente:

[font size=2 face="Courier New"][font color="#000000"]unit MYFtp;

interface

uses

  
Windows, Classes, WinINet,
  SysUtils;

type

  
TMyFtp = class(TComponent)
  private

    
FContext: Integer;
    FINet: HInternet;
    FFtpHandle: HInternet;
    FCurFiles: TStringList;
    FServer: string;
    FOnNewDir: TNotifyEvent;
    FCurDir: string;
    FUserID: string;
    FPassword: string;
    function GetCurrentDirectory: string;
    procedure SetUpNewDir;

  protected

    destructor 
Destroy; override;

  public

    constructor 
Create(AOwner: TComponent); override;
    function Connect: Boolean;
    function FindFiles: TStringList;
    function ChangeDirExact(S: string): Boolean;
    function ChangeDirCustom(S: string): Boolean;
    function BackOneDir: Boolean;
    function GetFile(FTPFile, NewFile: string): Boolean;
    function SendFile1(FTPFile, NewFile: string): Boolean;
    function SendFile2(FTPFile, NewFile: string): Boolean;
    function CustomToFileName(S: string): string;

  published

    property 
CurFiles: TStringList read FCurFiles;
    property CurDir: string read FCurDir;
    property UserID: string read FUserID write FUserID;
    property Password: string read FPassword write FPassword;
    property Server: string read FServer write FServer;
    property OnNewDir: TNotifyEvent read FOnNewDir write FOnNewDir;

  end;

procedure Register;

implementation

uses

  
Dialogs;

[font color="#000080"]// A few utility functions



[/font]procedure Register;
begin
  
RegisterComponents('Unleash', [TMyFtp]);
end;

function GetFirstToken(S: string; Token: Char): string;
var
  
Temp: string;
  Index: INteger;
begin
  
Index := Pos(Token, S);
  if Index < 1then
  begin
    
GetFirstToken := '';
    Exit;
  end;
  Dec(Index);
  SetLength(Temp, Index);
  Move(S[1], Temp[1], Index);
  GetFirstToken := Temp;
end;


function StripFirstToken(S: string; Ch: Char): string;
var
  
i, Size: Integer;
begin
  
i := Pos(Ch, S);
  if i = 0 then
  begin
    
StripFirstToken := S;
    Exit;
  end;
  Size := (Length(S) - i);
  Move(S[i + 1], S[1], Size);
  SetLength(S, Size);
  StripFirstToken := S;
end;



function ReverseStr(S: string): string;
var
  
Len: Integer;
  Temp: string;
  i, j: Integer;
begin
  
Len := Length(S);
  SetLength(Temp, Len);
  j := Len;
  for i := 1 to Len do
  begin
    
Temp := S[j];
    Dec(j);
  end;
  ReverseStr := Temp;
end;


function StripLastToken(S: string; Token: Char): string;
var
  
Temp: string;
  Index: INteger;
begin
  
SetLength(Temp, Length(S));
  S     := ReverseStr(S);
  Index := Pos(Token, S);
  Inc(Index);
  Move(S[Index], Temp[1], Length(S) - (Index -1));
  SetLength(Temp, Length(S) - (Index -1));
  StripLastToken := ReverseStr(Temp);
end;

constructor TMyFtp.Create(AOwner: TComponent);
begin
  inherited 
Create(AOwner);
  FCurFiles := TStringList.Create;
  FINet     := InternetOpen('WinINet1', 0, nil, 0, 0);
end;

destructor TMyFtp.Destroy;
begin
  if 
FINet <> nil then
    
InternetCloseHandle(FINet);
  if FFtpHandle <> nil then
    
InternetCloseHandle(FFtpHandle);
  inherited Destroy;
end;

function TMyFtp.Connect: Boolean;
begin
  
FContext   := 255;
  FftpHandle := InternetConnect(FINet, PChar(FServer), 0,
    PChar(FUserID), PChar(FPassWord),
    Internet_Service_Ftp, 0, FContext);
  if FFtpHandle = nil then
    
Result := False
  else
  begin
    
SetUpNewDir;
    Result := True;
  end;
end;


function TMyFtp.GetCurrentDirectory: string;
var
  
Len: DWORD;
  S: string;
begin
  
Len := 0;
  ftpGetCurrentDirectory(FFTPHandle, PChar(S), Len);
  SetLength(S, Len);
  ftpGetCurrentDirectory(FFTPHandle, PChar(S), Len);
  Result := S;
end;

procedure TMyFtp.SetUpNewDir;
begin
  
FCurDir := GetCurrentDirectory;
  if Assigned(FOnNewDir) then
    
FOnNewDir(Self);
end;

function GetDots(NumDots: Integer): string;
var
  
S: string;
  i: Integer;
begin
  
S := '';
  for i := 1 to NumDots do
    
S := S + ' ';
  Result := S;
end;

function GetFindDataStr(FindData: TWin32FindData): string;
var
  
S: string;
  Temp: string;
begin
  case 
FindData.dwFileAttributes of
    
FILE_ATTRIBUTE_ARCHIVE: S := 'A';
    [font color="#000080"]//    FILE_ATTRIBUTE_COMPRESSED: S := 'C';
    
[/font]FILE_ATTRIBUTE_DIRECTORY: S := 'D';
    FILE_ATTRIBUTE_HIDDEN: S    := 'H';
    FILE_ATTRIBUTE_NORMAL: S    := 'N';
    FILE_ATTRIBUTE_READONLY: S  := 'R';
    FILE_ATTRIBUTE_SYSTEM: S    := 'S';
    FILE_ATTRIBUTE_TEMPORARY: S := 'T';
    else
      
S := IntToStr(FindData.dwFileAttributes);
  end;
  S := S + GetDots(75);
  Move(FindData.CFilename[0], S[6], StrLen(FindData.CFileName));
  Temp := IntToStr(FindData.nFileSizeLow);
  Move(Temp[1], S[25], Length(Temp));
  Result := S;
end;


function TMyFtp.FindFiles: TStringList;
var

  
FindData: TWin32FindData;
  FindHandle: HInternet;
begin
  
FindHandle := FtpFindFirstFile(FFtphandle, '*.*',
    FindData, 0, 0);
  if FindHandle = nil then
  begin
    
Result := nil;
    Exit;
  end;
  FCurFiles.Clear;
  FCurFiles.Add(GetFindDataStr(FindData));
  while InternetFindnextFile(FindHandle, @FindData) do
    
FCurFiles.Add(GetFindDataStr(FindData));
  InternetCloseHandle(Findhandle);
  GetCurrentDirectory;
  Result := FCurFiles;
end;

function TMyFtp.CustomToFileName(S: string): string;
const
  
PreSize = 6;
var
  
Temp: string;
  TempSize: Integer;
begin
  
Temp     := '';
  TempSize := Length(S) - PreSize;
  SetLength(Temp, TempSize);
  Move(S[PreSize], Temp[1], TempSize);
  Temp   := GetFirstToken(Temp, ' ');
  Result := Temp;
end;

function TMyFtp.BackOneDir: Boolean;
var

  
S: string;
begin
  
S := FCurDir;
  S := StripLastToken(S, '/');
  if S = '/' then
  begin
    
Result := False;
    Exit;
  end;

  if S <> '' then
  begin
    
ChangeDirExact(S);
    Result := True;
  end
  else
  begin
    
ChangeDirExact('/');
    Result := True;
  end;
end;

[font color="#000080"]// Changes to specific directory in S
[/font]function TMyFtp.ChangeDirExact(S: string): Boolean;
begin
  if 
S <> '' then
    
FtpSetCurrentDirectory(FFTPHandle, PChar(S));
  Result := True;
  FindFiles;
  SetUpNewDir;
end;

[font color="#000080"]// Assumes S has been returned by GetFindDataString;
[/font]function TMyFtp.ChangeDirCustom(S: string): Boolean;
begin
  
S := CustomToFileName(S);
  if S <> '' then
    
FtpSetCurrentDirectory(FFTPHandle, PChar(S));
  Result := True;
  FindFiles;
  SetUpNewDir;
end;


function TMyFtp.GetFile(FTPFile, NewFile: string): Boolean;
begin
  
Result := FtpGetFile(FFTPHandle, PChar(FTPFile), PChar(NewFile),
    False, File_Attribute_Normal,
    Ftp_Transfer_Type_Binary, 0);
end;

function TMyFtp.SendFile1(FTPFile, NewFile: string): Boolean;
const
  
Size: DWORD = 3000;
var
  
Transfer: Bool;
  Error: DWORD;
  S: string;
begin
  
Transfer := FtpPutFile(FFTPHandle, PChar(FTPFile),
    PChar(NewFile),
    Ftp_Transfer_Type_Binary, 0);

  if not Transfer then
  begin
    
Error := GetLastError;
    ShowMessage(Format('Error Number: %d. Hex: %x',
      [Error, Error]));
    SetLength(S, Size);
    if not InternetGetLastResponseInfo(Error, PChar(S), Size) then
    begin
      
Error := GetLastError;
      ShowMessage(Format('Error Number: %d. Hex: %x',
        [Error, Error]));
    end;
    ShowMessage(Format('Error Number: %d. Hex: %x Info: %s',
      [Error, Error, S]));
  end
  else
    
ShowMessage('Success');
  Result := Transfer;
end;

function TMyFtp.SendFile2(FTPFile, NewFile: string): Boolean;
var
  
FHandle: HInternet;
begin
  
FHandle := FtpOpenFile(FFTPHandle, 'sam.txt', GENERIC_READ,
    FTP_TRANSFER_TYPE_BINARY, 0);
  if FHandle <> nil then
    
InternetCloseHandle(FHandle)
  else
    
ShowMessage('Failed');
  Result := True;
end;


end.
[/font][/font]



Kannst natürlich auch andere Komponenten verwenden wie ICS/Indy.
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
EgoFelix
Full Member
***
Offline Offline

Beiträge: 139


99943504
WWW
« Antworten #2 am: 16.03.2002, 21:56:28 »

Warum soooo kompliziert?
Versuchs mal hiermit:
Code:

procedure FTPDownload(aUrl, aDestFile: String);

var

Ftp: TNMFTP;

begin

Ftp := TNMFtp.Create(Self);

Ftp.Download(aUrl,aDestFile);

Ftp.Free;

end;

Gespeichert

EgoFelix
Seiten: [1] Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS