Boost logo

Boost Users :

Subject: [Boost-users] [Filesystem] API questions
From: Alan M. Carroll (amc_at_[hidden])
Date: 2009-07-02 13:34:56


I am trying to use Boost.Filesystem and have run in to some issues with the API which may be actual problems or a lack of understanding on my part.

1) What is the generic way to create current directory and parent directory relative paths, e.g. "." and ".."? Currently for current directory I use

  boost::filesystem::path(boost::filesystem::path::string_type(1,boost::filesystem::slash<boost::filesystem::path>::value))

which is a bit verbose. Parent directory relative path is the same with '2' instead of '1'. Further, it presumes that string_type has a constructor taking a repeat count and a character which may not be true in all cases. I would define these functionally as path instances which, if passed to current_path, would stay in the same directory or move to the parent directory respectively. Is this usage too file system specific to be included in the library? Is there a superior way to create such paths?

2) Why isn't there a path constructor / generator which takes a pair of path element iterators? E.g. like

  path make_path(path::iterator x, path::iterator y) {
    path zret;
    for ( ; x != y ; ++x ) zret /= *x;
    return zret;
  }

3) I tried to write my own templated make_path but I don't see how to either use the path class as the template parameter or compute the path class from its iterator. That is, I want to use

  path::iterator x,y; // set somehow
  path p = make_path(x,y);

Implemetation 1:

  template < typename Path > Path make_path(Path::iterator x, Path::iterator y) { ... }

This fails because Path can not be deduced from the use of Path::iterator instances.

Implementation 2:

  template < typename PathIter> ??? make_path(PathIter x, PathIter y) {...}

I don't see how to specify the return type given the type of an iterator. I think it would be reasonable to put this in the iterator class

  typedef boost::BOOST_FILE_SYSTEM_NAMESPACE::basic_path<String, Traits> path_type;

which would solve my problem. I was able to make it work with VC9 by adding this to the iterator definition in path.hpp

  typedef path_type path_type; // import from enclosing scope for clients

but I don't know how portable that is.

4) My actual goal is to write the function

  path between(path here, path there)

which returns a path such that after

  current_path(here);
  current_path(between(here,there));

this returns true

   equivalent(current_path(), there);

and where the returned path is as relative as possible. This is very handy for file generation to generate

# include "../inc/thing.h"

instead of

# include "C:/Documents and Settings/amc/view/main/inc/thing.h"

If there is already an easy way to do that, I would be happy to be so informed.

Thanks.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net