如何获取FreePascal/Lazarus中路径的父目录路径?

How to get the parent directory path of a path in FreePascal/Lazarus?

我有一个保存为字符串的目录路径,想知道如何从该字符串中轻松可靠地提取父目录?

我试图查看 FileUtil 和 SysUtils 中是否有一些方法,但到目前为止还没有找到任何东西。

嗯,我当然是在这里问了才知道的:

parentDirPath := FileUtil.ExtractFileNameOnly(
                   FileUtil.ChompPathDelim(theSubDirPath));

...会做!

FileUtil.ChompPathDelim() 部分对于 "fool" FPC 来说是必要的,以相信顶级文件夹是 "file"(因此不允许尾部斜线)。

最简单的方法是找到最后一个路径分隔符和 trim 源字符串。顺便说一句,还有一些选择:

program Project1;

uses
    sysutils;
var
    sExe: string;
    sParent: string;
    sParentProper: string;
begin
    sExe := ExtractFilePath(ParamStr(0)); // Get executable directory
    Writeln(sExe);
    sParent := IncludeTrailingPathDelimiter(sExe) + '..' + PathDelim; // Make parent path for executable
    Writeln(sParent);
    sParentProper := ExpandFileName(sParent); // Get absolute path based on relative path
    WriteLn(sParentProper);
    Readln;
end.  

输出为:

C:\Users\nd\AppData\Local\Temp\
C:\Users\nd\AppData\Local\Temp\..\
C:\Users\nd\AppData\Local\

因此使用此技术的正确方法是 ExpandFileName(IncludeTrailingPathDelimiter(sBasePath) + '..')

PS: 我们只使用 sysutils 单元,因此它是纯 FPC 解决方案,不需要任何 LCL 库。

一个更简单的方法是:

parentDirPath := ExtractFilePath(ExcludeTrailingPathDelimiter(thePath));

这适用于三大平台(Linux、Mac、OSX和Windows),thePath可能指的是文件或文件夹。