From: <jfu...@us...> - 2011-06-19 17:02:34
|
Revision: 3545 http://jcl.svn.sourceforge.net/jcl/?rev=3545&view=rev Author: jfudickar Date: 2011-06-19 17:02:28 +0000 (Sun, 19 Jun 2011) Log Message: ----------- function PathIsEqualOrChild added function PathRemoveSeparator : small Performance Tuning Modified Paths: -------------- trunk/jcl/source/common/JclFileUtils.pas Modified: trunk/jcl/source/common/JclFileUtils.pas =================================================================== --- trunk/jcl/source/common/JclFileUtils.pas 2011-06-19 17:01:22 UTC (rev 3544) +++ trunk/jcl/source/common/JclFileUtils.pas 2011-06-19 17:02:28 UTC (rev 3545) @@ -144,6 +144,7 @@ function PathGetTempPath: string; function PathIsAbsolute(const Path: string): Boolean; function PathIsChild(const Path, Base: string): Boolean; +function PathIsEqualOrChild(const Path, Base: string): Boolean; function PathIsDiskDevice(const Path: string): Boolean; function PathIsUNC(const Path: string): Boolean; function PathRemoveSeparator(const Path: string): string; @@ -2719,6 +2720,32 @@ {$ENDIF UNIX} end; +function PathIsEqualOrChild(const Path, Base: string): Boolean; +var + L: Integer; + B, P: string; +begin + Result := False; + B := PathRemoveSeparator(Base); + P := PathRemoveSeparator(Path); + // an empty path or one that's not longer than base cannot be a subdirectory + L := Length(B); + {$IFDEF MSWINDOWS} + Result := AnsiSameText(P, B); + {$ENDIF MSWINDOWS} + {$IFDEF UNIX} + Result := AnsiSameStr(P, B); + {$ENDIF UNIX} + if Result or (P = '') or (L >= Length(P)) then + Exit; + {$IFDEF MSWINDOWS} + Result := AnsiSameText(StrLeft(P, L), B) and (P[L+1] = DirDelimiter); + {$ENDIF MSWINDOWS} + {$IFDEF UNIX} + Result := AnsiSameStr(StrLeft(P, L), B) and (P[L+1] = DirDelimiter); + {$ENDIF UNIX} +end; + function PathIsDiskDevice(const Path: string): Boolean; {$IFDEF UNIX} var @@ -2894,7 +2921,7 @@ L: Integer; begin L := Length(Path); - if (L <> 0) and (Path[Length(Path)] = DirDelimiter) then + if (L <> 0) and (Path[L] = DirDelimiter) then Result := Copy(Path, 1, L - 1) else Result := Path; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |