![]() |
Pfade vegleichen...
Ich habe in 2 Strings 2 Pfadangaben
s1 := 'C:\Test\T1'; s2 := 'C:\Test\T1\Z'; Beim kopieren des Verzeichnisses s1 kopiere ich ja automatisch auch alle Unterordner AUCH den Z ordner mit, Also bräuchte ich s2 selsbt gar nicht mehr als kopiervorgang starten da ja Z in s1 enthalten ist. So, wie überprüfe ich ob die Pfadangabe s2 schon in s1 enthalten ist?! |
Re: Pfade vegleichen...
|
Re: Pfade vegleichen...
dachte ich mir schon, nur habe ich keinen plan wie das gehen soll da ich mir das gerade recht aufwendigvorstelle.
da ich ja nicht weiß wie lang der Pfad ist ergo kann ich ja nicht nach "/" suchen warscheinlich denke cih zu kompliziert |
Re: Pfade vegleichen...
Hi,
Du könntest entweder solange nach '/' suchen bis kein '/' mehr da ist (posex) oder du drehst den String um und suchst dann nach dem '/' Gruß Neutral General |
Re: Pfade vegleichen...
Nur schnell hingetippt:
Delphi-Quellcode:
Das liefert dir true zurück, falls der eine Pfad im anderen enthalten ist und über den var-Parameter MainPath wird der "Hauptpfad" zurückgegeben.
function PathIncluded(Path1, Path2: string; var MainPath: string): Boolean;
begin Path1 := IncludeTrailingBackslash(Path1); Path2 := IncludeTrailingBackslash(Path2); if Length(Path1) < Length(Path2) then begin if Pos(Path1, Path2) = 1 then begin MainPath := Path1; result := true; end; end else if Length(Path1) > Length(Path2) then begin if Pos(Path2, Path1) = 1 then begin MainPath := Path2; result := true; end; end else result := false; end; |
Re: Pfade vegleichen...
Hmm ok aber immer noch nen Denkblockade...
wenn ich solange nach / suche: bringt mich das nciht weiter da der letzte ja nicht unbedingt das sein muss was ich suche Beispiel: C:\Test\T1\Z\G\d wenn ich dann nach dem letzen \ suche ist das noch lange nicht true mit C:\Test\T1 natürlich wenn der Pfad nur C:\Test\T1\Z wäre dann verstehe ich das mit der pos geschichte Edit: @matze Danke werde ich mal testen und versuchen zu verstehen... |
Re: Pfade vegleichen...
Habe gerade noch etwas hinzugefügt. Getestet habe ich diese Funktion allerdings nicht.
|
Re: Pfade vegleichen...
moin,
wenn du zwei Pfade hast, ermittelst du erst den kürzeren der beiden. Anschließend vergleichst du den kleinen Pfad mit dem kopierten "längeren Pfad". Sind beide gleich lang, kannst du direkt vergleichen.
Code:
Als Denkanstoss sollte das genügen...
s1: "C:\test\a" // langer Pfad
s2: "C:\test\" // kurzer Pfad s1': copy(s1, 1, Length(s2)) CompareText(s1, s2') |
Re: Pfade vegleichen...
@matze
Super danke - dafür das du es nur hingeschrieben hast ist das super funktionierend... und ich habe mein Fehler beim denken auch bemerkt . ich kann mit POS ja nen Ganzen Pfad vergleichen... :wall: ... hatte immer nur sowas wie nach \ suche im Kopf :wall: :wall: Danke! :thumb: |
Re: Pfade vegleichen...
Auch nich getestet, aber ich glaub so in etwa hatte ich das geleöst.
Funktioniert auch mit relativen Pfaden, nicht mit UNC-Namen und auch nicht mit den eigebetteten NTFS-Laufwerken/Netzwerkfreigaben). Und dann fehlt hier auch noch der Teil für die 8.3-Dateinamen, also die langen/kurzen Nmen wie "abcdefghijklm.nop" <> "abcdef~1.nop".
Delphi-Quellcode:
Function PathIncluded(Check, MainDir: String): Boolean;
Var i: Integer; Begin Result := False; Check := AnsiLowerCase(ExpandUNCFileName(ExcludeTrailingBackslash(Check))); MainDir := AnsiLowerCase(ExpandUNCFileName(ExcludeTrailingBackslash(MainDir))); i := Min(Length(Check), Length(MainDir)); If Length(Check) <= i Then Exit; Result := (Check = Copy(MainDir, 1, i)) and ((Length(MainDir) = i) or (MainDir[i + 1] = '\')); End; s1 := 'C:\Test\T1'; s2 := 'C:\Test\T1\Z'; If PathIncluded(s2, s1) Then ... [add] stimmt, ExpandUNCFileName gab's ja och noch ... hatte nur noch ExpandFileName im Kopf. :oops: @bigg: bei dir wäre ein IncludeTrailingBackslash nicht schlecht, denn wenn mal keiner in s2 drin ist, dann gibt's da Probleme :zwinker: Bei Diesem wird sonst auch TRUE gesagt:
Delphi-Quellcode:
s1: "C:\test\abc" // langer Pfad
s2: "C:\test\a" // kurzer Pfad |
Re: Pfade vegleichen...
Hallo,
hier ist noch eine Routine (ohne Gewähr):
Delphi-Quellcode:
// Edit: Continue statt Exit...
// uses StrUtils
procedure OptimizePathList (aSource, aTarget: TStrings); var i, j : Integer; Path : string; begin aTarget.Clear; for i := 0 to aSource.Count - 1 do begin Path := ExpandUNCFileName(aSource[i]); if (path = '') then // Exit; Continue; for j := aTarget.Count - 1 downto 0 do if AnsiStartsText(aTarget[j], Path) then begin Path := ''; Break; end else if AnsiStartsText(Path, aTarget[j]) then aTarget.Delete(j); if (Path <> '') then aTarget.Add(Path); end; end; Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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 by Thomas Breitkreuz