Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pfade vegleichen... (https://www.delphipraxis.net/89057-pfade-vegleichen.html)

MrDevil 25. Mär 2007 13:31


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?!

Matze 25. Mär 2007 13:32

Re: Pfade vegleichen...
 
Hi

Das könntest du mit Delphi-Referenz durchsuchenPos lösen.

MrDevil 25. Mär 2007 13:35

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

Neutral General 25. Mär 2007 13:37

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

Matze 25. Mär 2007 13:41

Re: Pfade vegleichen...
 
Nur schnell hingetippt:

Delphi-Quellcode:
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;
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.

MrDevil 25. Mär 2007 13:42

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...

Matze 25. Mär 2007 13:44

Re: Pfade vegleichen...
 
Habe gerade noch etwas hinzugefügt. Getestet habe ich diese Funktion allerdings nicht.

bigg 25. Mär 2007 13:47

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:
s1: "C:\test\a" // langer Pfad
s2: "C:\test\" // kurzer Pfad

s1': copy(s1, 1, Length(s2))

CompareText(s1, s2')
Als Denkanstoss sollte das genügen...

MrDevil 25. Mär 2007 13:49

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:

himitsu 25. Mär 2007 14:02

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.
Seite 1 von 2  1 2      

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