Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi datei auf ftp suchen? (https://www.delphipraxis.net/135820-datei-auf-ftp-suchen.html)

nimmersattXD 18. Jun 2009 12:33


datei auf ftp suchen?
 
hallo zusammen!

ich moechte gern auf einem ftp server nach dateien suchen. mein programm hat schon eine routine das in ordern nach dateien sucht und eine verbindung zum ftp mittels indy-ftp herstellen kann.

wie kann ich nun in den ordern vom ftp nach dateien suchen?

auszuege aus meinem quelltext:

Delphi-Quellcode:
 
//routine die dateien sucht und in einer hashtable speichert
procedure GetFilesInDirectory1(Directory: String; const Mask: String;
                              List: TStringDictionary;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: String);
var
  SR: TSearchRec;
begin
  if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try
    repeat
      List.Add(Directory+SR.Name,nil);
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if WithSubDirs then begin
    if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory) = faDirectory) and
           (SR.Name <> '.') and (SR.Name <> '..') then
          ScanDir(Directory + SR.Name + '\');
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;

begin
    if ClearList then
      List.Clear;
    if Directory = '' then Exit;
    ScanDir(IncludeTrailingPathDelimiter(Directory));
end;

//routine die zur zeit noch in ordnern auf dem pc sucht (durch eingeben des pfades in EdPathP)
procedure TForm1.BtnSearchPicClick(Sender: TObject); //zum finden der Bilder in Ordner
var direct:string;
begin
direct:=EdpathP.Text;
hashpic:=TStringDictionary.Create;

if not (EdpathP.Text='') then
 begin
 GetFilesInDirectory(direct,'*.jpg',hashpic,true,true);
 GetFilesInDirectory(direct,'*.png',hashpic,true,false);
 GetFilesInDirectory(direct,'*.pdf',hashpic,true,false);
 GetFilesInDirectory(direct,'*.bmp',hashpic,true,false);
 GetFilesInDirectory(direct,'*.gif*',hashpic,true,false);
 end
else ShowMessage('Please, insert the directory paths first!');

LbPic.Caption:=inttostr(hashpic.TotalCount);

end;

Ralf Kaiser 18. Jun 2009 14:54

Re: datei auf ftp suchen?
 
Frage zur Implementation deiner Scanroutine für die normalen (also nicht-FTP) Dateien:

Wenn du 5 verschiedene Dateiarten suchen willst, warum scannst du dann 5 mal das komplette Verszeichnis? Übergib doch ein Array oder eine Liste von Dateimasken und scanne das Verzeichnis nur einmal!

(das kann für das Auslesen von Verzeichnissen per FTP sehr wichtig werden -> Bandbreite begrenzen)

Für das Auslesen von Verzeichnissen kannst du am besten die Indy-Komponente TidFTP verwenden. Dort gibt es auch Methoden mit denen sich Inhalte eines einzelnen Verzeichnisses listen lasssen. Diese müssen dann genauso wie in deinem Besipiel rekursiv aufgerufen werden um sich durch die Verzeichnisse zu "hangeln".

nimmersattXD 18. Jun 2009 15:12

Re: datei auf ftp suchen?
 
och menno, also muss ich meine ganze suchroutine, die ich aus dem easyDelphiHelper hab umschreiben?? sodass sie das gleiche auf dem ftp macht? und wie aender ich die routine denn um das sie nur einmal sucht? die TidFTP hab ich schon drin, un verbinden klappt auch schon ...

sorry bin anfaenger! :oops:

nimmersattXD 19. Jun 2009 09:33

Re: datei auf ftp suchen?
 
ok also wenn ich das procedure GetFilesInDirectory mit einem array als mask mache, dann muss ich doch auch mit ner zaehlschleife jedes einzelne element nehmen und suchen, dann kommt das doch aber auf das selbe drauf raus, wenn ich die prozedur so viele male aufrufe oder?

Morphie 19. Jun 2009 09:56

Re: datei auf ftp suchen?
 
Wenn du zum Bäcker gehst und dir ein Käsebrötchen, ein Körnerbrötchen und ein Brot kaufen möchtest, gehst du dann auch 3x zum Bäcker und kaufst alles einzeln?

nimmersattXD 19. Jun 2009 09:59

Re: datei auf ftp suchen?
 
aehm ich weiss ja was ihr meint, aber wenn ich die prozedur mit ner zaehlschleife mache, dann geht er doch auch mehrmals durch und sucht, oder ?? geht das auch anders?

Ralf Kaiser 19. Jun 2009 10:01

Re: datei auf ftp suchen?
 
Zitat:

Zitat von nimmersattXD
ok also wenn ich das procedure GetFilesInDirectory mit einem array als mask mache, dann muss ich doch auch mit ner zaehlschleife jedes einzelne element nehmen und suchen, dann kommt das doch aber auf das selbe drauf raus, wenn ich die prozedur so viele male aufrufe oder?

Stell dir vor, du scannst ein Verzeichnis mit 100000 Einträgen (inklusive aller Untereinträge). Dann musst du in deiner Variante 500000 Einträge durchsuchen.

Wenn du ein Array mit den Endungen übergibst dann musst du nur noch 100000 Einträge scannen und bei jeden Eintrag lediglich prüfen ob die Endung passt. Du hast dann immer noch 500000 Entscheidungen aber es wird wesentlich weniger auf die Platte zugegriffen.

Jetzt denk das ganze weiter: Beim FTP-Zugriff ist jeder Scanvorgang der auf dem Entfernten Server durchgeführt wird wesentlich "teurer" (Bandbreite). Da lohnt es sich schon mal darüber nachzudenken wie man Zugriffe auf eine externe Resource möglichst minimiert!

Ciao,
Ralf

nimmersattXD 19. Jun 2009 10:03

Re: datei auf ftp suchen?
 
ja doch ich hab euch von anfang verstanden, ich weiss nur nicht wie ich das mit nem array umschreiben kann, mir faellt halt dann nur eine zaehlschleife ein, aber da geht er doch dann auch in meinem fall 5 x durch die ordner oder nich? koennt ihr mir an nem beispiel quelltext zeigen wie ihr das machen wuerdet??

[edit]
so wuerde ich eure idee umsetzen: (was leider auch nicht funzt, weil ich bestimmt noch fehler drin hab)
Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: String; const Mask: Array of String;
                              List: TStringDictionary;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: String);
var
  SR: TSearchRec;
  i:integer;
begin
for i:=1 to 5 do
begin
  if FindFirst(Directory + Mask[i], faAnyFile - faDirectory, SR) = 0 then try
    repeat
      List.Add(SR.Name,nil);
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if WithSubDirs then begin
    if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory) = faDirectory) and
           (SR.Name <> '.') and (SR.Name <> '..') then
          ScanDir(Directory + SR.Name + '\');
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;
end;

begin
    if ClearList then
      List.Clear;
    if Directory = '' then Exit;
    ScanDir(IncludeTrailingPathDelimiter(Directory));
end;

....

procedure TForm1.BtnSearchPicClick(Sender: TObject); //zum finden der Bilder in Ordner
var direct:string;
    PicEnds: array[1..5] of string;
begin
direct:=EdpathP.Text;
hashpic:=TStringDictionary.Create;

PicEnds[1]:='*.jpg';
PicEnds[2]:='*.png';
PicEnds[3]:='*.pdf';
PicEnds[4]:='*.bmp';
PicEnds[5]:='*.gif';

if not (EdpathP.Text='') then GetFilesInDirectory(direct,picends,hashpic,true,true)
else ShowMessage('Please, insert the directory paths first!');

LbPic.Caption:=inttostr(hashpic.TotalCount);

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz