|
|
As mentioned in the introduction, a Path represents only a possible file in the underlying file system. To test whether the file represented by a given Path actually exists, (specifically, whether it can be ``statted'') use the function ksh_test.
Path p(...); if (!ksh_test(p)) cerr << "file not found!" << endl; else { // process the file // ... }
The function ksh_test is modeled after the file testing functionality of the Korn shell ``test'' function. This means that all the flags which make sense with file names in the Korn shell ``test'' have equivalents in Ksh_test.
ksh_test(Ksh_test::r, p) // same as `test -r p` ksh_test(Ksh_test::w, p) // same as `test -w p` ksh_test(Ksh_test::x, p) // same as `test -x p` ksh_test(Ksh_test::d, p) // same as `test -d p` // etc.
The first argument to ksh_test can be any member of the enumeration Ksh_test::-unary. If missing (as in the first program above), it is treated as Ksh_test::a. The Korn shell binary tests are also available.
ksh_test(p1, Ksh_test::ef, p2) // same as `test p1 -ef p2` ksh_test(p1, Ksh_test::nt, p2) // same as `test p1 -nt p2` ksh_test(p1, Ksh_test::ot, p2) // same as `test p1 -ot p2`
In 90% of the cases, one of the two enumerations Ksh_test::-unary or Ksh_test::-binary will contain the test the user needs to perform. In the remaining 10% of the cases, the user will have to do the desired test directly by calling stat(2).
#include <sys/stat.h> int owned_by_root(const Path & p) { stat s; return (::stat(p, &s) && s.st_uid == 0); }
Remember that inheritance is always available, so that such functions can be ``added'' to the Path interface.
class myPath : public Path { int owned_by_root() { return ::owned_by_root(*this); } };