Delphi中的目录路径操作?

6

我有一个给定文件夹的完整路径名,例如:

c:\foo\bar

现在我想引用 c:\foo 中名为 baz.txt 的文件。
c:\foo\bar\..\baz.txt

我目前使用 .. 路径操作符来向下一级并获取所需的文件。

是否有一个函数可以进行路径操作,例如 UpOneLevel(str) -> str ? 我知道我可以通过分割字符串并删除最后一个标记来编写一个函数,但我更希望它是一个内置/库函数,这样我将来就不会遇到问题,例如转义反斜杠。


使用哪个版本的Delphi?最近的版本有IOUtils单元,其中可能具有您正在寻找的功能;如果您使用早期版本的Delphi,则发布来自该版本的答案将毫无意义。您应该向其他标签添加特定于版本的标签(例如,delphi-2007delphi-xe3或适用的任何内容)。 - Ken White
@KenWhite 这是针对 Delphi 2007 的,我运气不好吗? - wmercer
2
当然不是。 :-) 答案可能会有所不同,但一切仍然有可能。 - Ken White
4
请注意避免调用IsRelativePath函数,它已经出现了问题。 - David Heffernan
4个回答

11

使用ExpandFileName函数:

var
  S: string;
begin
  S := 'c:\foo\bar\..';
  S := ExpandFileName(S);
  ShowMessage(S);
end;

以上示例的消息将显示 c:\foo 路径。


3
干得好!我接了个电话,回来之前你就解决了它。 :-) - Ken White

4

请查看ExtractFilePath()ExtractFileDir()。这些函数适用于几乎所有版本的Delphi,尤其是那些没有TDirectory、IOUtils等组件的版本。

在有人指出之前,这些函数无论路径是否以文件名结尾都能正常工作。例如,ForceDirectories()内部使用这些函数向上遍历父文件夹层级。


3

本答案适用于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;

在旧版本中

看看其他答案。


IOUtils未找到,我正在使用Delphi-2007。 - wmercer
问题明确标记为 delphi-2007,不包括 IOUtils。(我在原问题的评论中提到了这一点。)不会点踩,只是提一下。 :-) - Ken White
2
这是现代版本Delphi的最佳答案,因此请不要删除它(并点赞!)像这样的旧问题存在的风险是人们在应该使用其他答案时使用标记为正确的答案。 - David
@Ken,当我回答问题时,我没有注意到delphi-2007标签,现在我已经编辑过来以确保清晰明了。 - jachguate

1
你可以查看来自SvClasses单元的TPathBuilder记录,该记录属于delphi-oop库。该单元不支持Delphi 2007,但是TPathBuilder实现与该版本兼容。使用示例:
var
  LFullPath: string;
begin
  LFullPath := TPathBuilder.InitCustomPath('c:\foo\bar').GoUpFolder.AddFile('baz.txt').ToString;
  //LFullPath = c:\foo\baz.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接