|
Boost : |
From: Martin Adrian (adrianm_at_[hidden])
Date: 2006-03-10 02:27:45
1. The exception specifications are not clear
- All predicates (exists, is_*) will throw on errors but you need to look into
the status functions to see it.
- What happens if an error occurs while iteratoring a directory or when the
recursive iterator can't descend into a sub-folder.
2. Why not include the system_error code in the file_status object?
If you want to avoid exceptions with the currenct code you need to write code
like:
system_error_code ec;
file_status f(status(p, ec));
if (exists(f) && is_directory(f))
..
else if (status_known(f))
cout << "path is not a directory";
else
cout << system_error_message(ec); // can't find this function in the TR2
and
// I don't care what the problem is.
system_error_code ec;
if (is_regular(status(p, ec)))
...
Which is kind of messy since the ec and f can't be scoped. It also seem
strange that you need to define a system_error_code variable just to avoid
exceptions.
With a file_status object defined as
struct file_status {
explicit file_status(file_type v = status_unknown, system_error_code e = 0);
file_type type() const;
system_error_code error_code() const;
std::string system_error_message() const;
operator safe_bool() const { return ec == 0; }
};
the code can be written as:
if (file_status f(p, std::nothrow_t))
if (exists(f) && is_directory(f))
...
else
cout << "Path is not a directory";
else
cout << f.system_error_message();
and
if (is_regular(status(p, std::nothrow_t)))
...
3. Why not differentiate storage type and interface type in the basic_path
class?
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk