Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterverzeichnis überprüfen (https://www.delphipraxis.net/59622-unterverzeichnis-ueberpruefen.html)

faux 26. Dez 2005 09:12


Unterverzeichnis überprüfen
 
Hallo!

Ich parse mittels einer Rekursiven Funktion ein Verzeichnis und deren Unterverzeichnisse. Ich verschiebe die Dateien dann entsprechend.
Der User kann Quell- und Zielverzeichnis angeben. Jedoch darf das Zielverzeichnis nicht Unterverzeichnis des Quellverzeichnisses sein, da sonst eine Endlosschleife entsteht.
Wie kann ich überprüfen, ob ein Verzeichnis Unterverzeichnis eines anderen Verzeichnisses ist?

Grüße
Faux

marabu 26. Dez 2005 09:23

Re: Unterverzeichnis überprüfen
 
Hallo Faux,

sobald du mit kanonischen Dateinamen arbeitest, ist ein Verzeichnis sub ein Unterverzeichnis vom Verzeichnis dir, wenn gilt:

Delphi-Quellcode:
CompareText(Copy(sub, 1, Length(dir)), dir) = 0
Weihnachtsgrüße vom marabu

Sharky 26. Dez 2005 09:25

Re: Unterverzeichnis überprüfen
 
Zitat:

Zitat von faux
... Wie kann ich überprüfen, ob ein Verzeichnis Unterverzeichnis eines anderen Verzeichnisses ist?

Hai Faux,

mal so ins Blaue gedacht. Wenn ein Verzeichniss (V2) ein Unterverzeichniss eines anderen (V1) ist bedeutet dies doch das der String V1 komplett ein Bestandteil von V2 ist.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  V1 : String;
  V2 : String;
begin
  V1 := 'c:\sharky\blubb\';
  V2 := 'c:\sharky\blubb\meow';
  If Pos(V1,V2) = 1 then
  begin
    ShowMessage('V2 ist ein Unterverzeichniss von V1');
  end;
end;
Edit: Da war marabu mal wieder schneller :cry:

faux 26. Dez 2005 09:37

Re: Unterverzeichnis überprüfen
 
Danke für die Antwort!

Das habe ich mir im ersten Augenblick auch gedacht, was ich aber hiermit:

V1: C:\Documents and Settings\User\Dir
V2: C:\Docume~1\User\Dir\Subdir

oder hiermit:
V2: %userprofile%\Dir\Subdir

Gibts da nicht einen Algorithmus, der das überprüft. Also nicht "errechnet" sondern wirklich "nachsieht" ob das kein SubDir ist.

Grüße
Faux

marabu 26. Dez 2005 09:55

Re: Unterverzeichnis überprüfen
 
Kanonisieren kannst du mit den Funktionen GetFullPathName(), GetLongPathName() und GetShortPathName(). Wenn dabei nicht schon expandiert wird, dann hilft dir vielleicht noch das hier:

Delphi-Quellcode:
function ExpandEnvStr(const szInput: string): string;
begin
  SetLength(Result, ExpandEnvironmentStrings(pChar(szInput), nil, 0));
  ExpandEnvironmentStrings(pChar(szInput), @Result[1], Length(Result));
end;
marabu

faux 26. Dez 2005 10:08

Re: Unterverzeichnis überprüfen
 
OK. So weit so gut.

Kann mir mal wer ein Beispiel geben, wie man das lösen kann?
Ich komme auf keinen grünen Zweig.

Bsp:
V1: C:\Verzeichnis\Name\Unterverzeichnis
V2: C:\Anderes Verzeichnis\Name\Unterverzeichnis\Ende

Wie würdet ihr das hier lösen?

Danke schon mal.
Grüße
Faux

himitsu 26. Dez 2005 10:50

Re: Unterverzeichnis überprüfen
 
Die oben genannten Varianten könnte unter Umständen dennoch bei Netzlaufwerken, symbolischen Links, oder änlichen Dingen Probleme bekommen.

Am einfachsten wird es wohl sein, wenn du im Zielverzeichnis eine eindeutige Datei erstellst únd dann im Quellverzeichnis danach suchst, ist die da nicht vorhanden, dann ist das Zielverzeichnis nicht im Quellverzeichnis drin.
Und wenn die Datei doch gefunden wird, dann würde ich zur Sicherheit diese mal verändern (Dateiname, Dateiinhalt und/oder ...), um sicher zu gehn, daß es sich wirklich um die Selbe Datei handelt.



Eine andere Lösung wäre, wenn man erstmal eine Liste aller Dateien erstellst, die kopiert werden sollen, und erst dann diese kopierst.
Dann gibt es keine Endlosschleife und man kann dennoch die Dateien/Verzeichnisse in ein Unterverzeichnis kopieren ^^

faux 26. Dez 2005 13:22

Re: Unterverzeichnis überprüfen
 
Zitat:

Zitat von himitsu
Eine andere Lösung wäre, wenn man erstmal eine Liste aller Dateien erstellst, die kopiert werden sollen, und erst dann diese kopierst.
Dann gibt es keine Endlosschleife und man kann dennoch die Dateien/Verzeichnisse in ein Unterverzeichnis kopieren ^^

Danke.
Das ist die einfachste Lösung - Die hab ich jetzt genommen. ;)

Grüße
Faux


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 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