AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

(Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

Ein Thema von MisterNiceGuy · begonnen am 29. Jan 2010 · letzter Beitrag vom 30. Jan 2010
Antwort Antwort
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#1

(Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

  Alt 29. Jan 2010, 20:45
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;
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

  Alt 29. Jan 2010, 23:57
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#3

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

  Alt 30. Jan 2010, 00:25
Hast natürlich recht, habs geändert!
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

  Alt 30. Jan 2010, 07:40
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;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: (Indy) IdFTP: Prüfen ob ein Verzeichnis existiert

  Alt 30. Jan 2010, 08:04
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 22:18 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