15. juni 2008 - 14:41 Der er 9 kommentarer og
1 løsning

Hente indholdsfortegnelse fra en FTP server med Indy

En af mine bekendte har lavet en ftp server på sin egen pc hvor hun lægger en fil til mig en gang imellem. Jeg har så oprettet en netværksforbindelse til denne, hvor jeg så henter denne fil. vi bor i hver vores del af landet, derfor fildeling på denne måde.
Hvis jeg bruger Windows til at hente denne fil, ved at åbne 'Netværkssteder' vælge hendes server, vælge den rigtige mappe og fil, så er der ingen problemer med at hente den. Dette bare for at forklare at systemet virker.
Dette er dog en omstændig måde, så for at automatisere det har jeg lavet et program, i Delphi, til at hente den.
Dette burde heller ikke være et problem, tænkte jeg.
Jeg placerede en OpenDialog på formen, og så var det jo bare at skrive følgende.

procedure TForm97.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    // Her skal der så være en kode der aflæser OpenDialog1.FileName
    // og så udføre den kode der skal hente denne fil.
  end;
end;

Åbn dialogboksen vises også som den skal, og det går fint med at klikke på 'netværkssteder', vælge det rigtige netværkssted, åbne den rigtige mappe, og når man klikker på den fil man vil have fat i, kommer navnet også til at stå i feltet 'Filnavn', men lige så snart man klikker på 'Åbn' så fryser programmet.

Nå, men man kan jo også hente indholdsfortegnelsen med IdFTP, og så vise listen i et nyt vindue.

procedure TForm97.Button1Click(Sender: TObject);
begin
  try
    IdFTP.Host := 'remoteserver';
    IdFTP.User := 'brugernavn';
    IdFTP.Password := 'adgangskode';
    if IdFTP.Connected then IdFTP.Disconnect;
    IdFTP.Connect;
    IdFTP.ChangeDir('/radioprogrammer/');
    AFiles := TStringList.Create;
    AFiles.Clear;
    IdFtp.List(AFiles, '*.mp3', False);
    // Vis AFiles i et vindue hvor man kan vælge osv.
    AFiles.Destroy;
    Application.ProcessMessages;
    IdFTP.Disconnect;
  except
    on E: Exception do begin
      Application.MessageBox(PChar('Der er opstået en fejl i forbindelsen til serveren. Fejl: '+E.Message),'Fejl',MB_OK or MB_ICONERROR);
    end;
  end;
end;

Der fryser programmet også, men hvis jeg udfaser linien:
    IdFtp.List(AFiles, '*.mp3', False);
så kører programmet, men så henter den jo ikke noget.

Man kan godt downloade filen hvis man indsætter filnavnet direkte i koden, og den downloade mp3 fil kan også afspilles.

procedure TForm97.Button1Click(Sender: TObject);
begin  // Download test
  Source := 'Filnavn.mp3';
  Dest := 'C:\Filnavn.mp3';
  try
    IdFTP.Host := 'remoteserver';
    IdFTP.User := 'brugernavn';
    IdFTP.Password := 'adgangskode';
    if IdFTP.Connected then IdFTP.Disconnect;
    IdFTP.Connect;
    IdFTP.ChangeDir('/radioprogrammer/'); //skift evt. dir
    FilLen := IdFTP.Size(Source);
    ProgressBar1.Max := FilLen;
    Application.ProcessMessages;
    StartTid := Time;
    IdFTP.Get(Source, Dest, True);
    IdFTP.Disconnect;
    Label2.Caption := 'Færdig ' + IntToStr(SecondsBetween(Time, StartTid)) + ' sekunder.';
  except
    on E: Exception do begin
      Application.MessageBox(PChar('Der er opstået en fejl i forbindelsen til serveren. Fejl: '+E.Message),'Fejl',MB_OK or MB_ICONERROR);
    end;
  end;
end;

Det eneste jeg ikke kan, er hente indholdsfortegnelsen, og det er jeg nødt til, da filer har forskellige navne, og somme tider bliver de gamle filer liggende.
HJÆLP MIG!
Avatar billede kroning Nybegynder
15. juni 2008 - 18:26 #1
Bare en ide, har du prøvet med:
IdFtp.List(AFiles);

altså uden de 2 ekstra parametre
15. juni 2008 - 18:44 #2
Hvis man lader programmet stå længe nok, kommer den er fejlmeddelelse:
"Der er opstået en fejl i forbindelsen til serveren. Fejl: Socket Error # 10054"
"Connection reset by peer.".
Jeg kan ikke læse nogen steder hvad denne fejl betyder.
Fejlen kommer uanset om man skriver:
    IdFtp.List(AFiles, '*.mp3', False);
eller
    IdFtp.List(AFiles);
15. juni 2008 - 18:47 #3
Glem den sidste besked/fejlbeskrivelse, hun har slukket for serveren for i dag.
15. juni 2008 - 18:48 #4
Jeg vil dog stadigvæk gerne have gode ideer, som jeg kan afprøve næste weekend.
19. juni 2008 - 22:02 #5
Hej Kroning du skal have dine point, dit forslag virker.
Men det giver dog et tillægs spørgsmål.

Det der er i mappen er:
gladmusik21.mp3    (En fil)
gladmusiknr20.mp3  (En fil)
Ukendt kunstner    (Mappe)

Det der umidelbart vises:
-rwxrw-rw- 1 root  root 109268149 Jun 10 20:05 gladmusik21.mp3
-rwxrw-rw- 1 root  root 114624674 Jun  7 11:13 gladmusiknr20.mp3
drwxrw-rw- 1 root  root        0 Jun  9 20:25 Ukendt kunstner

Hvis man bruger 'ExtractFileName' får man:
05 gladmusik21.mp3
13 gladmusiknr20.mp3
25 Ukendt kunstner

Er der en nem måde at få udelukkende filnavnet?
Og sortere mappen fra, da dens indhold aldrig skal bruges?
19. juni 2008 - 22:11 #6
Nå ja mappen kan jo fjernes ved at maske på 'ExtractFileExt'.
Avatar billede kroning Nybegynder
19. juni 2008 - 22:12 #7
Jeg lavede engang denne kode:

    Dest:=TStringList.Create;

    if MainForm.ForbindOK then
  begin
      try
            MainForm.IdFTP.List(Dest);
    except
    end;
        MainForm.Afbryd;
  end;

  ListBox.Clear;
  for i:=0 to Dest.Count-1 do
  begin
      if copy(Dest[i],1,1)='d' then // a dir
        if Copy(Dest[i],56,1)<>'.' then // kommer med på nogle systemer
            ListBox.Items.Add(Copy(Dest[i],56,MaxInt));
    end;

    Dest.Free;

Hvis det første bogstav i linien er et d så er det en mappe så den medtages ikke.
Men ellers ser det ud til at jeg dengang fandt ud af at filnavnet altid var fra tagn 56 og frem, men det syntes jeg ikke jeg kan få til at passe med de 3 linier du har vist?
Avatar billede kroning Nybegynder
19. juni 2008 - 22:16 #8
De linier jeg fik så således ud og det burde da være standard:
drwxr-xr-x  2 ftp      ftp          512 Jan  5 00:09 110cc
drwxr-xr-x  2 ftp      ftp          512 Jan  4 16:13 2004
-rw-r--r--  1 ftp      ftp        176331 Jan  4 16:14 PICT0181.JPG
-rw-r--r--  1 ftp      ftp        193268 Jan  4 16:14 PICT0182.JPG
19. juni 2008 - 22:52 #9
Du skal lige lægge et svar så du kan få dine point.
Ang. de 56 tegn frem, så afhænger det vel af længden på filen, altså det antal cifre der er i fillængden.
Men ved ExtractFileName som altid starter efter det kolon der er i tidspunktet, så starter filnavnet altid ved tegn 4, så jeg klarede det med en simpel Copy.
Avatar billede kroning Nybegynder
19. juni 2008 - 23:01 #10
Hvis filnavnet altid starter ved tegn 56 er længden af navnet ikke vigtig, så kan du bruge:
Copy(AFiles[i],56,MaxInt);
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