Piero V.

Prendere la directory dell'eseguibile in C++

Talvolta può risultare utile sapere il percorso di un programma dal programma stesso. Un esempio pratico è quando bisogna caricare file come quelli di configurazione o risorse del programma.

Purtroppo non esiste un metodo cross-platform per farlo. Molti compilatori usano argv[0], però non è obbligatorio che lo facciano. Poi ogni piattaforma ha il suo metodo.

Purtroppo neanche boost provvede questa funzionalità, sebbene abbia una libreria sul filesystem.

Basandomi su vari metodi trovati su internet (dentro al file cpp ci sono tutti i link), ho fatto una classe, il cui scopo è gestire il filesystem, che, basandosi sul percorso dell’eseguibile, risale alla root dell’applicazione. Per il momento questa è l’unica funzionalità, in seguito ne aggiungerò altre per miei scopi.

Finora l’ho provata solo su Linux, perciò se qualcuno riesce a provarlo su altre piattaforme me lo faccia sapere.

Sono richieste le librerie boot filesystem e boost system, in quanto le uso per fare i controlli e ottenere il percorso assoluto e senza collegamenti.

Sorgente e header li potete scaricare qui: filesystem_cpp.tar.gz.

Lo rilascio in pubblico dominio, non ci dovrebbero essere problemi per questi frammenti di codice.

Piccola guida: innanzitutto c’è da notare che uso il singleton pattern, ovvero un’unica istanza di cui si può prendere il puntatore tramite il metodo statico getSingletonPtr o la reference tramite getSigleton, comunque con il metodo fromArguments(int argc, char **argv) impostate gli argomenti della main, se vi interessa prendere l’eseguibile da lì; invece appRoot restituisce una reference const dell’oggetto boost::filesystem::path con la root dell’applicazione.

Attenzione: si presuppone che l’eseguibile sia in app-root/altra-directory/eseguibile. Se fosse direttamente in app-root dovete modificare LEVELS in 1.