如何使用反斜杠符号和 2 个点 ('\..') 获取文件路径
How to get the path to the file using backslash symbol and 2 dots ('\..')
在 Delphi 程序中,我使用 ExtractFileDir 函数获取父文件夹,此代码工作正常:
Fmain.frxReport1.LoadFromFile(ExtractFileDir(ExtractFileDir(ExtractFileDir(ExtractFilePath(ParamStr(0)))))+'\FastReports\report1.fr3');
如何使用“\..”修改它并获取父文件夹的路径,因为它在Delphi示例程序
中实现
更新:
我写了这段代码:
setcurrentdir('../../');
s1:=getcurrentdir();
frxReport1.LoadFromFile(s1+'\FastReports\report1.fr3');
但我想要一行(作为我的代码与 ExtractFileDir )和易读的代码来替换我的代码。
我有一个绝对化相对路径的函数。
要绝对化路径,您需要知道基本路径。
在你显示的Delphi情况下,路径是相对于项目目录的。
有了绝对路径后,您可以多次应用 ExtractFilePath 以在目录级别中上升。
举个例子:你有一个相对路径“....\SomeFile.txt”。此路径相对于基本路径“C:\ProgramData\Acme\Project\Demo”。完整的路径是:“C:\ProgramData\Acme\Project\Demo...\SomeFile.txt”。那么AbsolutizePath的绝对路径结果就是"C:\ProgramData\Acme\SomeFile.txt".
请注意绝对路径处理“..”(父目录)、“.” (当前目录)和驱动器规格(如C:)。
function AbsolutizePath(
const RelPath : String;
const BasePath : String = '') : String;
var
I, J : Integer;
begin
if RelPath = '' then
Result := BasePath
else if RelPath[1] <> '\' then begin
if (BasePath = '') or
((Length(RelPath) > 1) and (RelPath[2] = ':')) then
Result := RelPath
else
Result := IncludeTrailingPathDelimiter(BasePath) + RelPath;
end
else
Result := RelPath;
// If there is no drive in the result, add the one from base if any
if (Length(Result) > 1) and (Result[2] <> ':') and
(Length(BasePath) > 1) and (BasePath[2] = ':') then
Insert(Copy(BasePath, 1, 2), Result, 1);
// Delete "current dir" marker
I := 1;
while TRUE do begin
I := Pos('\.\', Result, I);
if I <= 0 then
break;
Delete(Result, I, 2);
end;
// Process "up one level" marker
I := 1;
while TRUE do begin
I := Pos('\..\', Result, I);
if I <= 0 then
break;
J := I - 1;
while (J > 0) and (not CharInSet(Result[J], ['\', ':'])) do
Dec(J);
// Check if we hit drive delimiter and fix it
if (J = 2) and (Result[J] = ':') then
J := 3;
Delete(Result, J + 1, I - J + 3);
I := J;
end;
end;
在 Delphi 程序中,我使用 ExtractFileDir 函数获取父文件夹,此代码工作正常:
Fmain.frxReport1.LoadFromFile(ExtractFileDir(ExtractFileDir(ExtractFileDir(ExtractFilePath(ParamStr(0)))))+'\FastReports\report1.fr3');
如何使用“\..”修改它并获取父文件夹的路径,因为它在Delphi示例程序
中实现更新:
我写了这段代码:
setcurrentdir('../../');
s1:=getcurrentdir();
frxReport1.LoadFromFile(s1+'\FastReports\report1.fr3');
但我想要一行(作为我的代码与 ExtractFileDir )和易读的代码来替换我的代码。
我有一个绝对化相对路径的函数。 要绝对化路径,您需要知道基本路径。
在你显示的Delphi情况下,路径是相对于项目目录的。
有了绝对路径后,您可以多次应用 ExtractFilePath 以在目录级别中上升。
举个例子:你有一个相对路径“....\SomeFile.txt”。此路径相对于基本路径“C:\ProgramData\Acme\Project\Demo”。完整的路径是:“C:\ProgramData\Acme\Project\Demo...\SomeFile.txt”。那么AbsolutizePath的绝对路径结果就是"C:\ProgramData\Acme\SomeFile.txt".
请注意绝对路径处理“..”(父目录)、“.” (当前目录)和驱动器规格(如C:)。
function AbsolutizePath(
const RelPath : String;
const BasePath : String = '') : String;
var
I, J : Integer;
begin
if RelPath = '' then
Result := BasePath
else if RelPath[1] <> '\' then begin
if (BasePath = '') or
((Length(RelPath) > 1) and (RelPath[2] = ':')) then
Result := RelPath
else
Result := IncludeTrailingPathDelimiter(BasePath) + RelPath;
end
else
Result := RelPath;
// If there is no drive in the result, add the one from base if any
if (Length(Result) > 1) and (Result[2] <> ':') and
(Length(BasePath) > 1) and (BasePath[2] = ':') then
Insert(Copy(BasePath, 1, 2), Result, 1);
// Delete "current dir" marker
I := 1;
while TRUE do begin
I := Pos('\.\', Result, I);
if I <= 0 then
break;
Delete(Result, I, 2);
end;
// Process "up one level" marker
I := 1;
while TRUE do begin
I := Pos('\..\', Result, I);
if I <= 0 then
break;
J := I - 1;
while (J > 0) and (not CharInSet(Result[J], ['\', ':'])) do
Dec(J);
// Check if we hit drive delimiter and fix it
if (J = 2) and (Result[J] = ':') then
J := 3;
Delete(Result, J + 1, I - J + 3);
I := J;
end;
end;