我有给定文件夹的完整路径名,例如
c:\foo\bar
现在我想在 c:\foo 中引用一个名为 baz.txt 的文件,
c:\foo\bar\..\baz.txt
我目前正在使用 .. 路径运算符向下一层并获取我需要的文件。
是否有可以进行路径操作的函数,例如 UpOneLevel(str) -> str ?我知道我可以通过拆分字符串并删除最后一个标记来编写一个,但我宁愿它是一个内置/库函数,所以如果有例如转义的反斜杠,我以后不会遇到麻烦。
我有给定文件夹的完整路径名,例如
c:\foo\bar
现在我想在 c:\foo 中引用一个名为 baz.txt 的文件,
c:\foo\bar\..\baz.txt
我目前正在使用 .. 路径运算符向下一层并获取我需要的文件。
是否有可以进行路径操作的函数,例如 UpOneLevel(str) -> str ?我知道我可以通过拆分字符串并删除最后一个标记来编写一个,但我宁愿它是一个内置/库函数,所以如果有例如转义的反斜杠,我以后不会遇到麻烦。
使用ExpandFileName
功能:
var
S: string;
begin
S := 'c:\foo\bar\..';
S := ExpandFileName(S);
ShowMessage(S);
end;
来自上述示例的消息将显示c:\foo
路径。
看ExtractFilePath()
和ExtractFileDir()
。这些几乎在所有 Delphi 版本中都可用,尤其是那些没有 TDirectory、IOUtils 等的版本。
在任何人说之前,无论路径是否以文件名结尾,这些都可以正常工作。ForceDirectories()
例如,在内部使用它们向后遍历父文件夹的层次结构。
这个答案对 Delphi XE + 有效
使用 IOutils 单元的TDirectory类,它具有GetParent方法,如下所示:
uses IOUtils;
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := 'c:\foo\bar';
ShowMessage(TDirectory.GetParent(s));
end;
在旧版本中
看看其他答案。
您可以从delphi-oop库中查看 SvClasses单元中的TPathBuilder
记录。本单元不支持 Delphi 2007,但实现与此 Delphi 版本兼容。示例用法:TPathBuilder
var
LFullPath: string;
begin
LFullPath := TPathBuilder.InitCustomPath('c:\foo\bar').GoUpFolder.AddFile('baz.txt').ToString;
//LFullPath = c:\foo\baz.txt