C++ 如何使用源代码中没有的程序';s文件夹?

C++ 如何使用源代码中没有的程序';s文件夹?,c++,dos,C++,Dos,例如:我在MS DOS上,在文件夹C:\Documents and Settings\Programs中有一个源代码。我可以让源代码使用随机文件夹中的程序(例如gnuplot)吗? ShellExecute将查看PATH环境变量,因此不需要指定完整路径。现在,如果它真的是一个随机位置,而且它甚至不在PATH环境变量中,那么我猜你运气不好 如果它们甚至不在路径中,那么您必须在候选文件夹中搜索它。下面是如何在C++中实现路径的示例代码。 下面是一个使用Boost的示例: 目录列表.h #ifndef

例如:我在MS DOS上,在文件夹C:\Documents and Settings\Programs中有一个源代码。我可以让源代码使用随机文件夹中的程序(例如gnuplot)吗?

ShellExecute将查看PATH环境变量,因此不需要指定完整路径。现在,如果它真的是一个随机位置,而且它甚至不在PATH环境变量中,那么我猜你运气不好

如果它们甚至不在路径中,那么您必须在候选文件夹中搜索它。下面是如何在C++中实现路径的示例代码。 下面是一个使用Boost的示例:

目录列表.h

#ifndef DIRECTORYLIST_H_INCLUDED
#define DIRECTORYLIST_H_INCLUDED
#define BOOST_FILESYSTEM_NO_DEPRECATED

#include <iostream>
#include <list>
#include <string>


class directoryList {

    public:
        directoryList();
        ~directoryList();
        std::list<std::string> getListing(std::string path);
};
#endif // DIRECTORYLIST_H_INCLUDED

还有一些核心功能及其修改。Linux也可以使用类似的函数。

源代码的位置与system()调用定位程序的方式无关(我假设您使用该调用)。唯一相关的考虑是编译后的可执行文件的位置

请看一看Windows中的PATH环境变量-这是如何找到程序的。这是一个分号分隔的目录列表,Windows在其中查找可执行文件、BAT文件和DLL。在该列表中,当前目录和(我认为)EXE所在的位置都是前缀


该路径是在Windows XP中通过“系统控制面板”窗口小部件“高级”选项卡“环境”按钮设置的。对于Vista来说,事情更复杂——你需要以管理员的身份来完成。

正如Vinko所说,PATH环境变量决定了Windows将在何处查找程序文件

通常最好避免将可执行文件的路径硬编码到编译程序中。即使gnuplot位于您计算机上的特定文件夹中,它也可能不在其他计算机上的同一文件夹中。这将导致您对其他程序的调用失败。您可以将其存储在注册表中,让用户配置程序位置,或者提供搜索程序的安装程序。

以下是一些选项:

  • 在系统路径中搜索要运行的可执行文件
  • 允许用户在命令行上指定位置
  • 将该位置存储在配置文件中,并允许用户在安装期间(如果您有安装过程)或手动编辑该文件来指定该位置

  • 理想情况下,你会完成所有3个步骤,你能再解释一下吗?你说使用程序是什么意思?您想使用其他位置的头文件还是运行其他程序?我想运行其他程序..例如gnuplot..MS DOS?你有一个文件夹“C:\Documents And Settings”?你确定你使用的是MS-DOS而不是Microsoft Windows吗?我完全错了,你是对的!我使用的是windows,我使用的是promptMS DOS(TS声称有),没有ShellExecute我怀疑OP只有DOS而没有windows。就像我怀疑程序是否安装在“随机”文件夹中一样。你是对的,我在windows上。但是gnuplot没有安装。我只有.exe文件。我的意思是:即使我不知道它在哪个文件夹中,我怎么能让我的程序找到并运行gnuplot?thanx真的很多!我现在开始用C++的东西,这个博客真的很有用,学习很多新东西!是的,我想我会让用户指定位置。谢谢!
    #include "boost/filesystem/operations.hpp"
    #include "boost/filesystem/convenience.hpp"
    #include "boost/filesystem/path.hpp"
    #include "boost/progress.hpp"
    
    #include "directoryList.h"
    
    using namespace std;
    namespace fs = boost::filesystem;
    
    directoryList::directoryList() {}
    directoryList::~directoryList() {}
    
    list<string> directoryList::getListing(string base_dir) {
    
        list<string> rv;
        fs::path p(base_dir);
    
        for (fs::recursive_directory_iterator it(p); 
             it != fs::recursive_directory_iterator(); ++it) {
    
            string complete_filename = it->path().string();
            rv.insert(rv.begin(),complete_filename);
    
        }
    
        return rv;
    
    }
    
    directoryList *dl = new directoryList();
    filenames = dl->getListing("C:\\Program Files");
    //search for the file here, or modify the getListing to supply a filter