我正在维护一些用Delphi 6和C++ Builder 4编写的旧应用程序.使用任一编译器编译的应用程序都会出现一种看似奇怪的现象.即使将.exe复制到其他目录,它们也会记住它们的默认工作目录.什么是确定的默认工作目录,以及如何知道什么时候默认工作目录的机理是不相同的目录中的.exe位于?
例如:比方说,我的源代码和编译的32位PE MyApp.exe在C:\CppBuilder\Projects\MyApp.然后我MyApp.exe将该文件夹中的其他文件复制到USB闪存盘F:\.然后,在资源管理器中,双击我MyApp.exe在F:\和应用程序启动.用fopen打开的文件仍然是打开的C:\CppBuilder\Projects\Myapp.如果我重命名或删除文件夹C:\CppBuilder\Projects\Myapp,则输入文件将F:\按照我的预期打开.此外,文件打开对话框的默认文件夹的工作方式类似.
这个的潜在机制是什么?
对不起,如果这是一个愚蠢的问题,但我真的找不到答案,我很尴尬地说,而且它一直让我发疯.我想确定文件的打开位置,而不使用文件名中的完整路径.再说一遍,我很抱歉.如果你知道答案,请帮助我.
这是Windows 7及更高版本的一个功能,在底层调用GetOpenFileName()和GetSaveFileName().
具体来说,结构lpstrInitialDir领域的文档OPENFILENAME说:
lpstrInitialDir
类型:LPCTSTR初始目录.用于选择初始目录的算法在不同平台上变化.
Windows 7的:
- 如果lpstrInitialDir具有与第一次应用程序使用"打开"或"另存为"对话框时传递的值相同的值,则用户最近选择的路径将用作初始目录.
- 否则,如果lpstrFile包含路径,则该路径是初始目录.
- 否则,如果lpstrInitialDir不为NULL,则指定初始目录.
- 如果lpstrInitialDir为NULL且当前目录包含指定过滤器类型的任何文件,则初始目录是当前目录.
- 否则,初始目录是当前用户的个人文件目录.
- 否则,初始目录是Desktop文件夹.
Windows 2000/XP/Vista:
- 如果lpstrFile包含路径,则该路径是初始目录.
- 否则,lpstrInitialDir指定初始目录.
- 否则,如果应用程序过去使用了"打开"或"另存为"对话框,则会选择最近使用的路径作为初始目录.但是,如果应用程序未长时间运行,则会丢弃其保存的选定路径.
- 如果lpstrInitialDir为NULL且当前目录包含指定过滤器类型的任何文件,则初始目录是当前目录.
- 否则,初始目录是当前用户的个人文件目录.
- 否则,初始目录是Desktop文件夹.
此外,除非使用OFN_NOCHANGEDIR标志设置,否则调用公共文件对话框将不断将应用程序的工作目录更改为在该对话框中选择的最后一个 - 即是否选择/保存文件.即使OFN_NOCHANGEDIR已指定,工作目录仍会在用户导航对话框时更改,但在对话框关闭时也会恢复.这使得相对路径在多线程上下文中特别不安全.
fopen 在打开具有相对路径的文件时将使用当前工作目录,因此如果应用程序先前已更改其工作目录或通过调用上面的公共文件对话框来更改它们,则这些调用将受到影响.
| 归档时间: |
|
| 查看次数: |
652 次 |
| 最近记录: |