我想创建一个用C ++打开另一个.exe
文件的程序,我希望程序能够从任何目录运行,所以我不知道该文件的完整地址。
EG-
我制作的程序将出现在一个文件夹中,该文件夹又包含子文件夹,其中还包含javaportable.exe
。我希望程序在没有获得完整路径的情况下运行上面提到的.exe
。像普通DOS导航中的cd运算符。此外,如果可能,我想选择另一个.exe
,它将运行javaportable.exe
,并出现在上一个文件夹中。
答案 0 :(得分:1)
首先,标准C ++库不提供列出目录文件的任何此类函数。您可以使用boost库来完成此操作。解决这个问题并不容易。您必须实施许多技术才能完成这项工作。我可以给你所有可能的起始指针。
要将此代码移植到其他操作系统,您可能需要使用#preprocessor指令添加操作系统特定代码。 Boost Liberay已经跨平台了。
首先,您需要获取程序所在目录的当前路径:
为此,您可以使用以下windows os特定代码
#include <iostream>
#include <direct.h>
int main(){
char *path = NULL;
path = _getcwd(NULL, 0); // or _getcwd
if (path != NULL)
std::cout << path;
}
此处path变量包含当前目录的地址。您可以将此路径传递给下一个函数,该函数将进一步使用它来为您列出文件和目录。要列出目录,您可以使用 Boost Libraries 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;
}
}
最后将文件名与您要运行的文件名进行比较并执行它。
这个问题也可以通过许多其他方法解决,但我认为开始是很好的,你可以随时改进你的代码。
<强>参考文献:强>
How do I get a list of files in a directory in C++?
希望这会有所帮助。如果您需要任何进一步的帮助,请随时询问!