gpt4 book ai didi

delphi - 如何从我的改革路径中删除 Windows 驱动器字母?德尔福或帕斯卡

转载 作者:行者123 更新时间:2023-12-03 18:08:25 24 4
gpt4 key购买 nike

进一步this answered question我还有另一个棘手的问题。我的编码是 Free Pascal,但 Delphi 解决方案可能会起作用。

简而言之,我有一个串联路径的字符串值,它是通过获取源目录并在目标目录中重新创建该树而形成的。例如

C:\SourceDir\SubDirA成为F:\DestinationDir\SourceDir\SubDirA。

但是,我为我的程序的 Linux 版本提供的解决方案(如上面的链接中所示)不适用于 Windows 版本,因为我最终得到:

F:\DestionationDir\C:SourceDir\SubDirA.

这是无效的。

所以我想出了这个“仅在 Windows 中运行”代码来删除改革路径的中央驱动器号,但通过说“查看从左起第 4 个字符开始的字符串”将初始驱动器号留在开头. 如果找到 'C:',将其删除”,这样路径就变成 F:\DestinationDir\SourceDir\SubDirA。

{$IFDEF Windows} // Only do this for the Windows version
k := posex('C:', FinalisedDestDir, 4); // Find 'C:' in the middle of the concatanated path and return its position as k
Delete(FinalisedDestDir, k, 2); // Delete the 2 chars 'C:' of 'C:\' if found, leaving the '\' to keep the path valid
{$ENDIF}

现在,如果 C: 是所选目录的源,则可以正常工作。但很明显,如果用户从另一个驱动器(如 E:、F:、G: 或任何其他驱动器到 Z:)复制数据,它将不起作用。

所以我的问题是,如何对其进行编码,使其显示“如果在左数第 4 个字符之后找到任何驱动器号 a: 到 z:,则将其删除”?虽然任何可行的解决方案都“可行”,但理想情况下我需要一个快速的解决方案。最好的解决方案是一开始就不要把它放在那里,但是考虑到我在回复我之前的帖子时发布的解决方案,由于我用来形成的程序,我无法弄清楚如何不把它放在那里它。

最佳答案

这是我在应用程序中使用的代码:

function CombinePath(const BaseDir, Path: string): string;
begin
if IsPathDelimiter(Path, 1) then
Result := ExcludeTrailingBackSlash(BaseDir) + Path else
Result := IncludeTrailingBackSlash(BaseDir) + Path;
end;

function MapRootPath(const Path, NewPath: string): string;
var
Drive, RelativePath: string;
begin
Drive := ExtractFileDrive(Path); // e.g: "C:"
RelativePath := ExtractRelativePath(Drive, Path); // e.g: "Program Files\MyApp"
Result := CombinePath(NewPath, RelativePath);
end;

用法:

ShowMessage(MapRootPath('C:\SourceDir\SubDirA', 'F:\DestionationDir'));
// result is "F:\DestionationDir\SourceDir\SubDirA"

关于delphi - 如何从我的改革路径中删除 Windows 驱动器字母?德尔福或帕斯卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9449173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com