-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathBaseDir.pas
106 lines (91 loc) · 3.09 KB
/
BaseDir.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
unit BaseDir;
////////////////////////////////////////////////////////////////////////////////
//
// Author: Jaap Baak
// https://github.com/transportmodelling/Utils
//
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
interface
////////////////////////////////////////////////////////////////////////////////
Uses
SysUtils,IOUtils;
Type
TBaseDirectory = record
private
FBaseDirectory: String;
Procedure SetBaseDirectory(BaseDirectory: String);
public
Class Operator Initialize(out BaseDirectory: TBaseDirectory);
Class Operator Implicit(BaseDirectory: TBaseDirectory): String;
Class Operator Implicit(BaseDirectory: String): TBaseDirectory;
public
Constructor Create(const BaseDirectory: String);
Function Contains(const Path: String): Boolean; overload;
Function Contains(const Path: String; out RelativePath: String): Boolean; overload;
Function RelativePath(const AbsolutePath: string): String;
Function AbsolutePath(const RelativePath: String): String;
public
Property BaseDirectory: string read FBaseDirectory write SetBaseDirectory;
end;
////////////////////////////////////////////////////////////////////////////////
implementation
////////////////////////////////////////////////////////////////////////////////
Class Operator TBaseDirectory.Initialize(out BaseDirectory: TBaseDirectory);
begin
BaseDirectory.BaseDirectory := GetCurrentDir;
end;
Class Operator TBaseDirectory.Implicit(BaseDirectory: TBaseDirectory): String;
begin
Result := BaseDirectory.BaseDirectory;
end;
Class Operator TBaseDirectory.Implicit(BaseDirectory: String): TBaseDirectory;
begin
Result.BaseDirectory := BaseDirectory;
end;
Constructor TBaseDirectory.Create(const BaseDirectory: String);
begin
SetBaseDirectory(BaseDirectory);
end;
Procedure TBaseDirectory.SetBaseDirectory(BaseDirectory: String);
begin
FBaseDirectory := IncludeTrailingPathDelimiter(ExpandFileName(BaseDirectory));
end;
Function TBaseDirectory.Contains(const Path: String): Boolean;
begin
if TPath.IsRelativePath(Path) then
Result := true
else
begin
var Directory := Copy(Path,1,Length(FBaseDirectory));
Result := SameText(FBaseDirectory,Directory);
end;
end;
Function TBaseDirectory.Contains(const Path: String; out RelativePath: String): Boolean;
begin
if TPath.IsRelativePath(Path) then
begin
Result := true;
RelativePath := Path;
end else
begin
var Directory := Copy(Path,1,Length(FBaseDirectory));
Result := SameText(FBaseDirectory,Directory);
if Result then
RelativePath := Copy(Path,Length(FBaseDirectory)+1,MaxInt)
else
RelativePath := '';
end;
end;
Function TBaseDirectory.RelativePath(const AbsolutePath: string): String;
begin
Result := ExtractRelativePath(FBaseDirectory,AbsolutePath);
end;
Function TBaseDirectory.AbsolutePath(const RelativePath: String): String;
begin
if TPath.IsRelativePath(RelativePath) then
Result := ExpandFileName(FBaseDirectory+RelativePath)
else
Result := RelativePath;
end;
end.