Avatar billede darkside Nybegynder
06. juni 2001 - 04:36 Der er 41 kommentarer og
2 løsninger

FTP Spørgsmål

Okay here the deal.!
Jeg har en textfil der ligger på en http server med 10 filnavn i, eks:
filnavn1.zip
filnavn2.exe
filnavn3.jpg
osv
osv

nu er mit spørgsmål, følgende
Hvordan kan jeg læse den fil der ligger på serveren og hente de 4 filer som ligger i den på en FTP server, eks:
Programmet startes læser textfilen på http serveren og sender en request afsted til ftp serveren om at hente de filer som står i den.
Den skal så starte ved filnavn.zip og downloade den så når den er færdig skal til springe til næste fil osv osv indtil den når EOF.
Hvordan kan det gøres?
Avatar billede ziron Nybegynder
06. juni 2001 - 08:32 #1
ved du hvilke filer du skal downloade eller hvad???

/ZIRON
Avatar billede darkside Nybegynder
06. juni 2001 - 09:39 #2
Ja...
Avatar billede ziron Nybegynder
06. juni 2001 - 09:46 #3
så kan du bruge ftp-komponetet og så connecte til den server du nu skal og så henter du bare filerne 1 efter 1... jeg kan skrive noget til dig på torsdag hvis jeg har til, ellers på lørdag. skal til X-samen :-)

/ZIRON
Avatar billede darkside Nybegynder
06. juni 2001 - 10:36 #4
Ja men den skal jo læse i den text fil og hente de filer som står i den.
Avatar billede martinlind Nybegynder
06. juni 2001 - 11:00 #5
Netop, du downloader den første fil læser oplysningerne og downloader derefter de andre filer, ikke så svært som det lyder, men en ftp comp.
Avatar billede ziron Nybegynder
06. juni 2001 - 11:01 #6
nemlig :-)

/ZIRON
Avatar billede borrisholt Novice
06. juni 2001 - 14:37 #7
Der følgende kode viser hvordan du fra en Delphi applikation logger ind på Microsofts FTP server og viser indholder af roden i et memo felt. Du får din liste udleveret i en TStringList, så du kan gøre ved den hvad du vil ....


Lav en ny applikation, på fanen \"Fastnet\" finder du et komponent der hedder NMFTP. Sådan en smækker du på din form sammen med en knap og et memo felt.

Dit NMFTP komponent giver du et OnConnect Event, og din knap et OnClick, så skriver du det følgende kode til knappen :

procedure TForm1.Button1Click(Sender: TObject);
begin
  NMFTP1.Passive := true;
  NMFTP1.UserID :=\'anonymous\';
  NMFTP1.Password := \'aa@aa.aa\';
  NMFTP1.Host := \'ftp.microsoft.com\';
  NMFTP1.Vendor := NMOS_AUTO;
  NMFTP1.ParseList := true;
  NMFTP1.Connect;
end;

på OnConnect til dit NMFTP komponent skriver du :

procedure TForm1.NMFTP1Connect(Sender: TObject);
begin
  NMFTP1.List;
  Memo1.Lines.Assign(NMFTP1.FTPDirectoryList.name);
end;


Så spiller det !

Jens B http://fotx.net/borrisholt
Avatar billede borrisholt Novice
07. juni 2001 - 15:08 #8
Ved du hvad ? Jeg har lige fundet ud af at hvis man læser spørgsmålet, er der en pæn chnce for at svare rigtigt. Nå prøv det her :

Sæt et NMFTP og et NMHTTP komponent på en form. Begge finder du under FastNet fanen. Smid også en knap på din form.

Under din private del af din form erklærer du dig en StringList :

type
  TForm1 = class(TForm)
    .....
  private
    StringList : TStringList;
  public
    { Public declarations }
  end;


giv din form et onCreateEvent, og sæt dit FTP komponent op der :

procedure TForm1.FormCreate(Sender: TObject);
begin
  NMFTP1.Passive := true;
  NMFTP1.UserID :=\'Brugernavn\';
  NMFTP1.Password := \'Hemmeligt\';
  NMFTP1.Host := \'ftp.hest.com\';
  NMFTP1.Vendor := NMOS_AUTO;
  NMFTP1.ParseList := true;
end;

Hust at lave brugernavn, password og host rigtigt op.

Giv din knap en onClick event :

procedure TForm1.Button1Click(Sender: TObject);
begin
  NMHTTP1.Get(\'http://hest.com/files.txt\');
  StringList := TStringList.Create;
  StringList.Text := NMHTTP1.Body;
  NMFTP1.Connect;
end;

nu mangler vi blot at give vores FTP komponent en onConnect event :

procedure TForm1.NMFTP1Connect(Sender: TObject);
var
  i : Integer;
begin
for i:= 0 to StringList.Count -1 do
  NMFTP1.Download(StringList[i],StringList[i]);
end;

Så er du i luften !

Jens B http://fotx.net/borrisholt
Avatar billede darkside Nybegynder
08. juni 2001 - 01:09 #9
borrisholt>>
Ja det ser rigtigt nok ud :)
er der en mulighed for at man kan smide en statusbar på så man kan se hvor langt den er kommet.?
Avatar billede ziron Nybegynder
08. juni 2001 - 01:10 #10
ja det er bare at sige max på StringList.Count -1 og så tæller den bare en op hver gang den kører for sætningen...

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 01:12 #11
?
eks?
Avatar billede darkside Nybegynder
08. juni 2001 - 01:14 #12
Hm det skulle faktisk være en Gauge eller en Progressbar.
Avatar billede ziron Nybegynder
08. juni 2001 - 01:21 #13
var
i : Integer;
begin
ProgressBar1.Min := 0;
ProgressBar1.Max := strtoint(Edit1.Text);
for i := 0 to strtoint(edit1.text) do
  ProgressBar1.Position := ProgressBar1.Position + 1;

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 01:23 #14
og så med dine oplysninger:

var
i : Integer;
begin
ProgressBar1.Min := 0;
ProgressBar1.Max := StringList.Count -1;
for i := 0 to StringList.Count -1 do
  ProgressBar1.Position := ProgressBar1.Position + 1;

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 01:28 #15
Perfekt.!
Du skulle vel ikke også vide hvordan man kan tjekke om filen allerede findes på disken, og hvis den gør så skal den ikke hentes, ddu skal nok få lidt flere point.
Avatar billede ziron Nybegynder
08. juni 2001 - 01:29 #16
ZIRON sprøger dig om du ved hvor filen bliver gemt????

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 01:30 #17
Hm jeg kan se at efter den har hentet den første fil så bliver progressbar\'en bare i top, den starter ikke forfra.
det bedste ville være hvis den viste hvor langt den var kommet med alle filerne
Avatar billede darkside Nybegynder
08. juni 2001 - 01:31 #18
Hm det kan være i c:\\windows\\system
eller bare i c:\\windows
Avatar billede ziron Nybegynder
08. juni 2001 - 01:32 #19
er det så noget med at der skal være taget forbehold for ændringer???

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 01:33 #20
Hm nej det skal bare være sådan at hvis filen er der så skal dne ikke hentes.
Avatar billede ziron Nybegynder
08. juni 2001 - 01:34 #21
det med progressbaren så bliver det jo noget helt andet kan hurtig godt prøve, men hopper af lige om lidt skal til X-samen imorgen kl. 9...

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 01:35 #22
Okay
Thx.!
Avatar billede darkside Nybegynder
08. juni 2001 - 01:36 #23
Du kan vel ikke gøre så den bruges en Gauge istedet?
Avatar billede ziron Nybegynder
08. juni 2001 - 01:37 #24
jo men jeg laver det nok først imorgen men prøver lige hurtig...
Avatar billede ziron Nybegynder
08. juni 2001 - 01:46 #25
brug dette:

procedure TForm1.ftpPacketRecvd(Sender: TObject);
var
i : Integer;
begin
Form1.Gauge1.Progress := ftp.BytesRecvd;
Form1.Gauge1.MaxValue := ftp.BytesTotal;
end;

ftp er navnet på dit ftp-komponet...

/ZIRON

Avatar billede darkside Nybegynder
08. juni 2001 - 01:49 #26
Thx.!
er 50 point okay?
Avatar billede ziron Nybegynder
08. juni 2001 - 01:50 #27
hva så 50 til mig og 200 til borrisholt???

okay med mig...

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 01:51 #28
men husk ud på at du har brugt min tid hvor jeg kunne have øvet til X-samen imorgen :-)

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 01:57 #29
jeg takker :-)

og håber du kunne bruge det???

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 01:58 #30
Jepz :)
Nu mangler jeg bare det med at tjekke om filen findes i forvejen!
der er 100 point til den der kan klare det :)
Avatar billede ziron Nybegynder
08. juni 2001 - 02:02 #31
okay 2 sek..
Avatar billede ziron Nybegynder
08. juni 2001 - 02:06 #32
sådan:

procedure TForm1.Button1Click(Sender: TObject);
VAR
  S  : TSearchRec;
begin
if FindFirst(IncludeTrailingBackslash(\'c:\\windows\\\')+\'den_fil_du_nu_skal_finde.jul\',faANYFILE,S) = 0 then
Showmessage(\'filen findes :-)\')
else
Showmessage(\'filen findes ikke :-(\');
end;

/ZIRON
Avatar billede darkside Nybegynder
08. juni 2001 - 02:08 #33
Hm det skal helst være uden de msgboxe :)
Hvis filen findes så skal den jo ikke hentes, men hvis den ikke findes så skal den hentes.
Avatar billede ziron Nybegynder
08. juni 2001 - 02:11 #34
procedure TForm1.Button1Click(Sender: TObject);
VAR
  S  : TSearchRec;
begin
if FindFirst(IncludeTrailingBackslash(\'c:\\windows\\\')+\'den_fil_du_nu_skal_finde.jul\',faANYFILE,S) = 0 then
begin
NMHTTP1.Get(\'http://hest.com/files.txt\');
  StringList := TStringList.Create;
  StringList.Text := NMHTTP1.Body;
  NMFTP1.Connect;
end
else
begin
//hvad du nu vil have den til hvis filen allerede findes.
end;
Avatar billede ziron Nybegynder
08. juni 2001 - 02:13 #35
hov omvendt...

procedure TForm1.Button1Click(Sender: TObject);
VAR
  S  : TSearchRec;
begin
if FindFirst(IncludeTrailingBackslash(\'c:\\windows\\\')+\'den_fil_du_nu_skal_finde.jul\',faANYFILE,S) = 0 then
begin
//hvad du nu vil have den til hvis filen allerede findes.

end
else
begin
NMHTTP1.Get(\'http://hest.com/files.txt\');
  StringList := TStringList.Create;
  StringList.Text := NMHTTP1.Body;
  NMFTP1.Connect;

end;
Avatar billede darkside Nybegynder
08. juni 2001 - 02:14 #36
Hm hvis filen findes så skal den bare springe over den i listen og tage den næste og tjekke om den findes. hvis den så ikke gør den skal den hentes
Avatar billede ziron Nybegynder
08. juni 2001 - 02:22 #37
så:

procedure TForm1.Button1Click(Sender: TObject);
VAR
  S  : TSearchRec;

begin
if FindFirst(IncludeTrailingBackslash(\'c:\\windows\\\')+\'den_fil_du_nu_skal_finde.jul\',faANYFILE,S) = 0 then
begin
//hvad du nu vil have den til hvis filen allerede findes.
  NMHTTP1.Get(IncludeTrailingBackslash(\'c:\\windows\\\')+\'den_fil_du_nu_skal_finde.jul\');
  StringList := TStringList.Create;
  StringList.Text := NMHTTP1.Body;
  NMFTP1.Connect;

end
else
begin
  NMHTTP1.Get(\'http://hest.com/files.txt\');
  StringList := TStringList.Create;
  StringList.Text := NMHTTP1.Body;
  NMFTP1.Connect;


end
end;
Avatar billede darkside Nybegynder
08. juni 2001 - 02:31 #38
Hm den overskriver filen selvom den findes..
Avatar billede ziron Nybegynder
08. juni 2001 - 02:33 #39
nej jeg tror ikke jeg er med, uddyb lige... går i seng om lidt...

/ZIRON
Avatar billede ziron Nybegynder
08. juni 2001 - 02:33 #40
har du icq???
Avatar billede darkside Nybegynder
08. juni 2001 - 02:34 #41
Ja 11940927
Avatar billede borrisholt Novice
08. juni 2001 - 09:08 #42
darkside>> Jeg skal beklage jeg ikke havde min fulde opmærksomhed rettet mod dit spørgsmål. Her kommer så mit svar med gauge og sager :

du smider 2 gauger på din for: Gauge1 er progress i Current file, mens gauge 2 er progress totalt set.

Så ændere du dit onConnect event til at se således ud :

procedure TForm1.NMFTP1Connect(Sender: TObject);
var
  s : String;
  FileCount : Integer;
begin
NMFTP1.List;
FileCount := 0;

while(FileCount< StringList.Count) do
begin
  s:= StringList[FileCount];

  inc(FileCount);
  Gauge2.Progress := Trunc((FileCount / StringList.Count) * 100);

  if FileExists(s) then
    continue;

  NMFTP1.Download(s,s);
end;
end;


des foruden få du brug for at gibe til FTP komponent et OnPacketRecvd() event. Det skal se således ud :

procedure TForm1.NMFTP1PacketRecvd(Sender: TObject);
begin
Gauge1.Progress := Trunc((NMFTP1.BytesRecvd / NMFTP1.BytesTotal) * 100)
end;


Så spiller det 1.000.000

Jens B
Avatar billede martinlind Nybegynder
08. juni 2001 - 12:02 #43
Til jer alle >> Check lige Delphi Filehandling\'s rutiner, der ligger bla. FileExists()

/Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester