Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
Delphi 12 Athens
|
Re: CompareWildString...
31. Mär 2006, 18: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
|