【发布时间】:2018-02-23 20:21:39
【问题描述】:
我正在维护一些用 Delphi 6 和 C++Builder 4 编写的旧应用程序。使用这两种编译器编译的应用程序会出现一种看起来很奇怪的现象。他们倾向于记住他们的默认工作目录,即使 .exe 被复制到不同的目录。确定默认工作目录的机制是什么,以及如何知道默认工作目录何时不是 .exe 所在的目录?
示例:假设我在C:\CppBuilder\Projects\MyApp 中有源代码和已编译的 32 位 PE MyApp.exe。然后我将MyApp.exe 和该文件夹中的其他文件复制到USB 闪存盘F:\。然后,在资源管理器中,我双击 MyApp.exe 中的 F:\ 并启动应用程序。使用 fopen 打开的文件仍然从 C:\CppBuilder\Projects\Myapp 打开。如果我重命名或删除文件夹C:\CppBuilder\Projects\Myapp,那么输入文件将从F:\ 打开,正如我所期望的那样。文件打开对话框的默认文件夹也类似。
这背后的机制是什么?
对不起,如果这是一个愚蠢的问题,但我真的找不到答案,我不好意思说,它时不时让我发疯。我想确定从哪里打开文件,而不是在文件名中使用完整路径。再次,我很抱歉。如果你知道答案,请帮助我。
【问题讨论】:
-
他们倾向于记住他们的默认工作目录,即使 .exe 被复制到不同的目录。这是现代操作系统的一个功能
-
进程的初始工作目录是运行EXE的文件夹,除非EXE是由另一个应用程序启动的,在这种情况下,初始工作目录是父进程的工作目录,除非另有说明(例如,通过
CreateProcess()或ShellExecute/Ex()的参数)。fopen()不应该发生您所描述的事情(无论如何,您不应该使用相对路径)。 -
文件对话框,另一方面,是完全不同的东西。他们有自己的规则来确定他们显示的初始目录。调用进程的工作目录只是他们考虑的众多因素之一。文件对话框 API 函数的特定规则记录在 MSDN 中。
-
如果您使用相对文件名,那么您将得到您想要的。您不控制工作目录。您说您不想使用绝对路径,但这就是问题所在。做正确的想法。使用绝对路径。问题解决了。
-
我通常在我的应用程序开始时将任何对话框或文件浏览器的目录设置为相对于使用
ExtractFilePath(Application->ExeName);获得的exe路径以避免此类问题...`
标签: delphi c++builder