Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert (https://www.delphipraxis.net/146939-indy-idftp-pruefen-ob-ein-verzeichnis-existiert.html)

MisterNiceGuy 29. Jan 2010 20:45


(Indy) IdFTP: Prüfen ob ein Verzeichnis existiert
 
Hallo liebe Leute,
da schon häufiger gefragt wurde wie ich über die Indykomponente IdFTP abfrage ob ein Verzeichnis existiert habe ich
folgende Funktion geschrieben:

Delphi-Quellcode:
function ftpDirExists(ftp:TIdFTP; dir:String; fromRoot:boolean):boolean;
  var tempDir      : String;
      tempDir2      : String;
      tempDir3      : String;
      extractedDirs : TStringList;
      tempList     : TStringList;
      i            : integer;
begin
  result := false;
  // connected?
  if not ftp.Connected then exit;

  if dir[length(dir)] <> '/' then
    dir := dir + '/';

  // Initialize objects
  extractedDirs := TStringList.Create;
  tempList := TStringList.Create;

  // Store current dir
  tempDir := ftp.RetrieveCurrentDir;

  // go to the main dir if necessary
  if fromRoot then
    ftp.ChangeDir('/');
  tempDir3 := ftp.RetrieveCurrentDir;

  // extract all single directories in the dir path
  for i := 1 to length(dir) do
  begin
    if dir[i] = '/' then
    begin
      if tempDir2 <> '' then
      begin
        extractedDirs.Add(tempDir2);
        tempDir2 := '';
      end;
    end
    else tempDir2 := tempDir2 + dir[i];
  end;

  // Get List for each depth and check if dir exists
  for i := 0 to extractedDirs.Count-1 do
  begin
    tempList.Clear;
    ftp.List(tempList,'*',false);
    if tempList.IndexOf(extractedDirs.Strings[i]) = -1 then
    begin
      result := false;
      exit;
    end
    else
    begin
      tempDir3 := tempDir3 + extractedDirs.Strings[i]+'/';
      ftp.ChangeDir(tempDir3);
    end;
  end;

  //Clear objects
  extractedDirs.Free;
  tempList.Free;
  ftp.ChangeDir(tempDir);
  result := true;
end;
Wichtig ist, dass das Verzeichnis das ihr durchsuchen wollt mit einem '/' beginnt und,
dass eine Verbindung zum FTP-Server besteht.

Ein Beispielaufruf würde so aussehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  IdFTP1.Username := 'padmalcom';
  IdFTP1.Password := 'blubb';
  IdFTP1.Host := 'www.myftp.de';
  if not IdFTP1.Connected then
    IdFTP1.Connect;
  if ftpDirExists(idFTP1, '/Backup/ftp tool/', true) then
    showmessage('true')
  else showmessage('false');
end;

rollstuhlfahrer 29. Jan 2010 23:57

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert
 
kleine doofe Frage: also die FTP-Verzeichnisse werden ja alle mit einem "/" angesprochen. Bei dir sind da jetzt an dieser Stelle lauter "\". Ich finde, dass die Verzeichnisnamen durch ein "\" ziemlich komisch aussehen.

Bernhard

MisterNiceGuy 30. Jan 2010 00:25

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert
 
Hast natürlich recht, habs geändert!

toms 30. Jan 2010 07:40

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert
 
Geht das nicht einfacher?

Delphi-Quellcode:
function FTPDirExists(DirName : String; IdFTPComp : TIdFTP) : Boolean;
var
 DirList : TStringList;
begin
 Result := False;
 DirList := TStringList.Create;
 try
  IdFTPComp.List(DirList, DirName, True);
  if DirList.Count > 0 then
    Result := True;
 finally
   DirList.Free;
 end;
end;

mirage228 30. Jan 2010 08:04

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert
 
Ich sehe in Deinem Code zudem drei potentielle Probleme
  • Die IdFTP Komponenten wird nicht auf <> nil geprüft (Zugriffverletzung beim ersten Zugriff)
  • Der String wird nicht auf Länge > 0 geprüft (Zugriffverletzung beim Abgreifen des letzten Zeichen). Siehe zusätzlich Delphi-Referenz durchsuchenAnsiLastChar
  • Um die erstellte StringListe ist kein Ressourcenschutzblock (try/finally) (Potentielles Speicherleck)
Weiterhin sind die Variablen TempDir1 bis 3 nicht gerade eindeutige Bezeichner...

Und noch was: Für neuere Delphi Versionen wäre so etwas eventuelle eine schöne Gelegenheit einen Delphi-Referenz durchsuchenclass helper zu verwenden ;)


Viele Grüße


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:34 Uhr.

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