Thema: Delphi CompareWildString...

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.225 Beiträge
 
Delphi 12 Athens
 
#3

Re: CompareWildString...

  Alt 31. Mär 2006, 17:52
So, gerade sind noch zwei weitere Funktionen entstanden, damit kann man prüfen ob eine Datei/Verzeichnis (FileName) in WildPath, oder seinen Unterverzeichnissen enthalten ist.

mögliche Flags: cfIgnoreCase, cfCanMask, cfCaseSensitive,
(cfNoMaskOverDir ist sozusagen immer gesetzt)

Hier mal ein paar Beispiele, welche TRUE zurückliefern:
Delphi-Quellcode:
IsFileUnderPath('Dir\', 'Dir\Dir2\')
IsFileUnderPath('Dir\Dir2\', 'Dir\Dir2\')
IsFileUnderPath('Dir\', 'Dir\Dir2\File')
IsFileUnderPath('Dir\Dir2\', 'Dir\Dir2\File')
IsFileUnderPath('Dir\*\', 'Dir\Dir2\File')
Delphi-Quellcode:
  Function IsFileUnderWildPath(WildPath, FileName: String; Flags: TCompareFlags = []): Boolean;
    Var W, N: Integer;

    Begin
      WildPath := StringReplace(WildPath, '/', '\', [rfReplaceAll]);
      FileName := StringReplace(FileName, '/', '\', [rfReplaceAll]);
      If (WildPath <> '') and (WildPath[Length(WildPath)] <> '\') Then WildPath := WildPath + '\';
      Result := False;
      W := Pos('\', WildPath);
      N := Pos('\', FileName);
      While (W > 0) and (N > 0) do Begin
        If not CompareWildString(Copy(WildPath, 1, W - 1), Copy(FileName, 1, N - 1), Flags + [cfIgnoreCase]) Then Exit;
        Delete(WildPath, 1, W);
        Delete(FileName, 1, N);
        W := Pos('\', WildPath);
        N := Pos('\', FileName);
      End;
      If W > 0 Then Exit;
      Result := True;
    End;

  Function IsFileUnderWildPathEx(WildPath, FileName: String; Flags: TCompareFlags = []): TStringArray;
    Var W, N: Integer;
      A: TStringArray;
      S: String;

    Procedure AddArray;
      Var i, i2: Integer;

      Begin
        If (Pos('*', S) <> 0) or (Pos('?', S) <> 0) Then Begin
          i := Length(Result);
          SetLength(Result, i + Length(A));
          For i2 := 0 to High(A) do Result[i2 + i] := A[i];
        End;
      End;

    Label goExit;

    Begin
      WildPath := StringReplace(WildPath, '/', '\', [rfReplaceAll]);
      FileName := StringReplace(FileName, '/', '\', [rfReplaceAll]);
      If (WildPath <> '') and (WildPath[Length(WildPath)] <> '\') Then WildPath := WildPath + '\';
      Result := nil;
      W := Pos('\', WildPath);
      N := Pos('\', FileName);
      While (W > 0) and (N > 0) do Begin
        S := Copy(WildPath, 1, W - 1);
        A := CompareWildStringEx(S, Copy(FileName, 1, N - 1), Flags + [cfIgnoreCase]);
        If A <> nil Then AddArray Else GoTo goExit;
        Delete(WildPath, 1, W);
        Delete(FileName, 1, N);
        W := Pos('\', WildPath);
        N := Pos('\', FileName);
      End;
      If W > 0 Then Goto goExit;
      If Result = nil Then SetLength(Result, 1);
      Exit;

      goExit:
      Result := nil;
    End;
PS: was ich wohl unbedingt noch erwähnen muß, die Datei/Verzeichnissvergleiche arbeiten nur mit den ihnen übergebenen Werten, also es muß nichts davon existieren.
Allerdings müssen alle Namen vom selben yp und der Selben Position aus angegeben sein, also 8.3-Dateinamen können nicht mit den langen Dateinamen verglichen werden, ebenso wie relative und vollträndige Pfadangaben. (wie sollte das auch möglich sein, wenn nicht auf reale Daten zurückgegriffen wird )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat