¿Cómo usar un programa que no está en la carpeta del código fuente?

StackOverflow https://stackoverflow.com/questions/427693

  •  06-07-2019
  •  | 
  •  

Pregunta

Por ejemplo: estoy en MS DOS, tengo un código fuente en la carpeta C: \ Documentos y configuraciones \ Programas. ¿Puedo hacer que mi código fuente use un programa (por ejemplo, gnuplot) que está en una carpeta aleatoria?

¿Fue útil?

Solución

Aquí hay algunas opciones:

  1. Busque en el RUTA del sistema el ejecutable que desea ejecutar
  2. Permitir al usuario especificar la ubicación en la línea de comandos
  3. Almacene la ubicación en un archivo de configuración y permita al usuario especificarla durante la instalación (si tiene un proceso de instalación) o editando el archivo a mano

Idealmente harías los 3

Otros consejos

http://www.codeproject.com/KB/system/newbiespawn.aspx

ShellExecute buscará en la variable de entorno PATH, por lo que no necesita especificar el PATH completo. Ahora, si realmente es una ubicación aleatoria y ni siquiera está en la variable de entorno PATH, entonces supongo que no tienes suerte.

Si ni siquiera están en la RUTA, entonces debes buscarla en la carpeta de candidatos. Aquí hay un código de muestra sobre cómo recorrer una ruta del sistema de archivos en C ++.

Y un ejemplo usando Boost:

directorioLista.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

directoryList.cpp

#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;

}

Muestra de uso:

directoryList *dl = new directoryList();
filenames = dl->getListing("C:\\Program Files");
//search for the file here, or modify the getListing to supply a filter

También hay algunas funciones principales _exec / exec y sus modificaciones Funciones similares están disponibles para Linux.

La ubicación del código fuente no tiene nada que ver con la forma en que los programas se ubican mediante la llamada system () (supongo que usa esa llamada). La única consideración relevante es la ubicación del ejecutable compilado.

Eche un vistazo a la variable de entorno PATH en Windows: así es como se encuentran los programas. Es una lista de directorios separados por punto y coma donde Windows busca ejecutables y archivos BAT y DLL. A esa lista, el directorio actual y (creo) el lugar donde se encuentra su EXE se anteponen.

La RUTA se configura en Windows XP desde el widget del panel de control del Sistema pestaña Avanzada Botón Entorno. Para Vista, las cosas son más complicadas: debe hacerlo como administrador.

Como dijo Vinko, la variable de entorno PATH determina dónde buscará Windows los archivos de programa.

Generalmente es mejor evitar codificar la ruta de un ejecutable en su programa compilado. Incluso si gnuplot está en una carpeta particular en su máquina, entonces podría no estar en la misma carpeta en la computadora de otra persona. Esto provocará que su llamada al otro programa falle. Puede almacenarlo en el registro y dejar que el usuario configure la ubicación del programa, o proporcionar un instalador que lo haya buscado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top