c++wxwidgetsboost-filesystem

Expand file names that have environment variables in their path


What's the best way to expand

${MyPath}/filename.txt to /home/user/filename.txt

or

%MyPath%/filename.txt to c:\Documents and settings\user\filename.txt

without traversing the path string looking for environment variables directly?

I see that wxWidgets has a wxExpandEnvVars function. I can't use wxWidgets in this case, so I was hoping to find a boost::filesystem equivalent or similar.

I am only using the home directory as an example, I am looking for general purpose path expansion.


Solution

  • For UNIX (or at least POSIX) systems, have a look at wordexp:

    #include <iostream>
    #include <wordexp.h>
    using namespace std;
    int main() {
      wordexp_t p;
      char** w;
      wordexp( "$HOME/bin", &p, 0 );
      w = p.we_wordv;
      for (size_t i=0; i<p.we_wordc;i++ ) cout << w[i] << endl;
      wordfree( &p );
      return 0;
    }
    

    It seems it will even do glob-like expansions (which may or may not be useful for your particular situation).