我有一个给定文件夹的完整路径名,例如:
c:\foo\bar
现在我想引用 c:\foo 中名为 baz.txt 的文件。
c:\foo\bar\..\baz.txt
我目前使用 .. 路径操作符来向下一级并获取所需的文件。
是否有一个函数可以进行路径操作,例如 UpOneLevel(str) -> str ? 我知道我可以通过分割字符串并删除最后一个标记来编写一个函数,但我更希望它是一个内置/库函数,这样我将来就不会遇到问题,例如转义反斜杠。
我有一个给定文件夹的完整路径名,例如:
c:\foo\bar
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-2007
,不包括 IOUtils
。(我在原问题的评论中提到了这一点。)不会点踩,只是提一下。 :-) - Ken WhiteTPathBuilder
记录,该记录属于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
IOUtils
单元,其中可能具有您正在寻找的功能;如果您使用早期版本的Delphi,则发布来自该版本的答案将毫无意义。您应该向其他标签添加特定于版本的标签(例如,delphi-2007
,delphi-xe3
或适用的任何内容)。 - Ken White