![]() |
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; |
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". |
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: |
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?
|
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?
|
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?
|
Re: datei auf ftp suchen?
Zitat:
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 |
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