如何使用反斜杠符号和 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;