Delphi 获取文件位置
Posted
技术标签:
【中文标题】Delphi 获取文件位置【英文标题】:Delphi Get file location 【发布时间】:2014-06-18 09:51:41 【问题描述】:要确定我的 exe 路径,我不知道应该使用哪个代码。 请给我解释何时以及为什么我们应该使用:
1. ExtractFilePath(ParamStr(0))
2. ExtractFilePath(Application.ExeName)
因为两个代码都呈现相同的输出。
C:\Users\Bianca\Documents\RAD Studio\Projects\Exam1\Win32\Release\
C:\Users\Bianca\Documents\RAD Studio\Projects\Exam1\Win32\Release\
【问题讨论】:
Application.ExeName
getter 内部调用 ParamStr(0)
。
那么,选项 2 总是首选?
这是没有人能说的。如果您不想依赖Application
对象(需要包含Forms
单元并要求您的应用程序是VCL 表单应用程序),请使用ParamStr(0)
。如果您有一个 VCL 表单应用程序,并且不介意包含 Forms
单元,则可以使用可读性更好的 Application.ExeName
。我更喜欢ParamStr(0)
。
谢谢@TLama 现在我很清楚了。 ;)
我认为如果应用程序在网络共享上,ParamStr(0) 不会很好地执行。
【参考方案1】:
它们都给你相同的结果,但有细微的差别。
Application.ExeName 引用 VCL 应用程序对象。使用此属性需要您使用 Vcl.Forms 单元。这在内部确实调用了 ParamStr(0) 函数。
请注意,FireMonkey TApplication 类没有此属性(从 XE5 开始)。因此,如果您使用 FireMonkey,则不能调用 Application.ExeName。如果你曾经将 VCL 项目迁移到 FireMonkey,你将不得不重写它。
ParamStr 函数 OTOH 是系统单元并且是多平台的(Win、Mac、ios 和 android,取决于您使用的 Delphi 版本的 OC)。在 Windows 上 ParamStr(0) 调用 GetModuleFileName 函数,而在其他平台上,它解析返回第一个标记的命令行,该标记应该是完整路径和正在运行的可执行文件的名称。 (感谢 Rob Kennedy 的更正)
所以...我建议你直接使用 ParamStr(0)。
【讨论】:
谢谢@frazz,非常清楚的解释。非常感谢;)ParamStr(0)
不返回“执行命令的第一个参数”。您正在考虑 Unix 和 C 的 argv
数组,其中操作系统和运行时简单地将任何任意值转发给 execv
,希望它是程序名称。在Delphi中,该函数对0进行特殊处理,并调用GetModuleFileName
直接获取EXE文件的名称(在Windows上,反正我不知道它在其他平台上的实现)。
感谢指出,我已经检查了代码并更新了答案。【参考方案2】:
它们在功能上是相同的。如果您不想要 Forms
单元的开销和所有它的包袱,您将使用 ParamStr(0)
。
【讨论】:
以上是关于Delphi 获取文件位置的主要内容,如果未能解决你的问题,请参考以下文章