C++:无论我是 运行 来自 IDE 的程序还是作为独立的可执行文件,都可以找到某个文件夹
C++: Find a certain folder regardless of if I am running the program from an IDE or as a standalone executable
假设我的程序需要访问当前存储在 bin 中的文件夹 'Files' 中的某些文件。在 Visual Studio 中,我可以将当前工作目录指定为 'bin',因此如果我 运行 将我的代码与 Visual Studio 结合使用,那么我只能按名称访问文件夹文件,而无需任何附加文件路径信息。例如
std::ifstream file;
file.open("Files\someFile.txt");
但是,如果我 运行 我的程序作为独立的可执行文件,那么它当然无法找到文件。这是一个问题,因为我打算将其作为独立的可执行文件进行测试。
处理这种情况的通常方法是什么?
在您的程序中使用相对路径时,您基本上是在要求 OS 相对于当前工作目录搜索它。不是来自可执行文件所在的目录。因此,如果您的可执行文件位于以下位置 C:\a\out.exe
并且您在 C:\b
中使用 ..\a\out.exe
调用它,您的工作目录仍将是 C:\b
.
当您从 Visual Studio 运行(默认情况下)时会发生这种情况。
您可以在项目设置 - 配置 Properties/Debugging 中更改它。将工作目录从 $(ProjectDir)
更改为 $(TargetDir)
UPD.
在此处了解有关 MSVC 项目宏的更多信息:https://msdn.microsoft.com/en-us/library/c02as0cs.aspx
您可以在注册表中保存您的路径。在您的开发系统上,您可以手动将一个密钥添加到包含路径的注册表中,当您发布软件时,您可以使用安装程序将此密钥设置为您需要的任何值。查看 this link from the Microsoft web page 以了解如何使用注册表。
如果您知道您的文件始终位于可执行文件所在的文件夹中,您还可以使用 the windows API function GetModuleFileName
检索可执行文件的路径。有时这对于预编译器块很有用,例如:
#ifdef STANDALONE
... GetModuleFileName ...
#else
... [open hard coded path] ...
#endif
STANDALONE
是在IDE.
之外测试软件时定义的宏
假设我的程序需要访问当前存储在 bin 中的文件夹 'Files' 中的某些文件。在 Visual Studio 中,我可以将当前工作目录指定为 'bin',因此如果我 运行 将我的代码与 Visual Studio 结合使用,那么我只能按名称访问文件夹文件,而无需任何附加文件路径信息。例如
std::ifstream file;
file.open("Files\someFile.txt");
但是,如果我 运行 我的程序作为独立的可执行文件,那么它当然无法找到文件。这是一个问题,因为我打算将其作为独立的可执行文件进行测试。
处理这种情况的通常方法是什么?
在您的程序中使用相对路径时,您基本上是在要求 OS 相对于当前工作目录搜索它。不是来自可执行文件所在的目录。因此,如果您的可执行文件位于以下位置 C:\a\out.exe
并且您在 C:\b
中使用 ..\a\out.exe
调用它,您的工作目录仍将是 C:\b
.
当您从 Visual Studio 运行(默认情况下)时会发生这种情况。
您可以在项目设置 - 配置 Properties/Debugging 中更改它。将工作目录从 $(ProjectDir)
更改为 $(TargetDir)
UPD.
在此处了解有关 MSVC 项目宏的更多信息:https://msdn.microsoft.com/en-us/library/c02as0cs.aspx
您可以在注册表中保存您的路径。在您的开发系统上,您可以手动将一个密钥添加到包含路径的注册表中,当您发布软件时,您可以使用安装程序将此密钥设置为您需要的任何值。查看 this link from the Microsoft web page 以了解如何使用注册表。
如果您知道您的文件始终位于可执行文件所在的文件夹中,您还可以使用 the windows API function GetModuleFileName
检索可执行文件的路径。有时这对于预编译器块很有用,例如:
#ifdef STANDALONE
... GetModuleFileName ...
#else
... [open hard coded path] ...
#endif
STANDALONE
是在IDE.