我想在 C++ 中创建一个打开另一个 .exe
文件的程序,我希望该程序能够从任何目录运行,所以我不知道该文件的完整地址。
例如-
我创建的程序将存在于一个文件夹中,该文件夹又具有子文件夹,其中进一步包含 javaportable.exe
。我希望程序运行上面提到的 .exe
而无需获取完整路径。类似于正常 DOS 导航中的 cd 运算符。另外,如果可能的话,我想选择另一个 .exe
,它将通过 javaportable.exe
运行,并且存在于上一个文件夹中。
最佳答案
首先,标准 C++ 库不提供任何此类函数来列出目录中的文件。您可以使用 boost 库来完成这项工作。解决这个问题并不是那么容易。您将必须实现很多技术才能完成这项工作。我可以给你所有可能的起始点。
要将此代码移植到其他操作系统,您可能需要使用 # 预处理器指令添加特定于操作系统的代码。 Boost Liberay 已经是跨平台的。
首先,您需要获取程序所在目录的当前路径:
为此,您可以使用以下 windows 操作系统特定代码
#include <iostream>
#include <direct.h>
int main(){
char *path = NULL;
path = _getcwd(NULL, 0); // or _getcwd
if (path != NULL)
std::cout << path;
}
这里的路径变量包含当前目录的地址。您可以将此路径传递给下一个函数,该函数将进一步使用它为您列出文件和目录。要列出目录,您可以使用 Boost Liberaries http://www.boost.org/
接下来您需要获取当前目录中的所有文件和文件夹。为此使用 Boost 库
使用来自 boost 的示例代码 http://www.boost.org/doc/libs/1_37_0/libs/filesystem/example/simple_ls.cpp
然后创建一个类,将接收到的地址和带路径的文件名存储在它的对象中。您可以将所有列出的地址存储在一个对象中,例如 dir[1].str[size]、dir[2].str[size]...
等等。
现在再次将您收到的所有文件夹地址传递给增强功能并获取更多文件名。以上所有都需要多次通过。
您还可以获得特定文件扩展名的文件列表:
#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_FILESYSTEM_NO_DEPRECATED
#include <boost/filesystem.hpp>
namespace fs = ::boost::filesystem;
// return the filenames of all files that have the specified extension
// in the specified directory and all subdirectories
void get_all(const fs::path& root, const string& ext, vector<fs::path>& ret)
{
if(!fs::exists(root) || !fs::is_directory(root)) return;
fs::recursive_directory_iterator it(root);
fs::recursive_directory_iterator endit;
while(it != endit)
{
if(fs::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename());
++it;
}
}
最后将文件名与您要运行的文件名进行比较并执行。
这个问题也可以通过许多其他方法解决,但我认为开始会很好,您可以随时改进您的代码。
引用资料:
关于c++ - 在不知道 C++ 完整路径的情况下打开 .exe 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29934738/