git-svn-id: https://free-cad.svn.sourceforge.net/svnroot/free-cad/trunk@5000 e8eeb9e2-ec13-0410-a4a9-efa5cf37419d
203 lines
5.0 KiB
C++
203 lines
5.0 KiB
C++
#ifndef FILEPATH_H
|
|
#define FILEPATH_H
|
|
|
|
#include "zipios-config.h"
|
|
|
|
#include <stdexcept>
|
|
#include <string>
|
|
|
|
namespace zipios {
|
|
|
|
using namespace std ;
|
|
|
|
/** FilePath represents a path to a file or directory name. FilePath has
|
|
member functions to check if the file path is a valid file system entity,
|
|
and to check what kind of file system entity it is, e.g. is it a file, a
|
|
directory, a pipe etc.
|
|
*/
|
|
class FilePath {
|
|
public:
|
|
/** Constructor.
|
|
@param path A string representation of the path.
|
|
@param check_exists If true is specified the constructor will
|
|
check the existence and type of the path immidiately, instead of
|
|
deferring that task until it is needed. */
|
|
FilePath( const string &path = "", bool check_exists = false ) ;
|
|
|
|
inline FilePath &operator= ( const string &rhs ) ;
|
|
|
|
inline operator string() const ;
|
|
|
|
/** Concatenates FilePath objects. A file separator is inserted
|
|
if appropriate. */
|
|
inline FilePath operator+ ( const FilePath &name ) const ;
|
|
|
|
/** Returns filename of the FilePath object by pruning the path
|
|
off. */
|
|
inline FilePath filename() const ;
|
|
|
|
|
|
/** @return true If the path is a valid file system entity. */
|
|
inline bool exists() const ;
|
|
|
|
/** @return true if the path is a regular file. */
|
|
inline bool isRegular() const ;
|
|
|
|
/** @return true if the path is a directory. */
|
|
inline bool isDirectory() const ;
|
|
|
|
/** @return true if the path is character special (a character
|
|
device file). */
|
|
inline bool isCharSpecial() const ;
|
|
|
|
/** @return true if the path is block special (a block device
|
|
file). */
|
|
inline bool isBlockSpecial() const ;
|
|
|
|
/** @return true if the path is a socket. */
|
|
inline bool isSocket() const ;
|
|
|
|
/** @return true if the path is a Fifo (a pipe). */
|
|
inline bool isFifo() const ;
|
|
|
|
protected:
|
|
|
|
/** Prunes the trailing separator of a specified path. */
|
|
inline void pruneTrailingSeparator() ;
|
|
|
|
/** This function sets _checked to true, stats the path, to see if
|
|
it exists and to determine what type of file it is. All the query
|
|
functions check if _checked is true, and if it isn't they call
|
|
check(). This means stat'ing is deferred until it becomes
|
|
necessary. */
|
|
void check() const ;
|
|
|
|
static const char _separator;
|
|
|
|
// FIXME: Should be bitfield
|
|
mutable bool _checked ;
|
|
mutable bool _exists ;
|
|
mutable bool _is_reg ;
|
|
mutable bool _is_dir ;
|
|
mutable bool _is_char ;
|
|
mutable bool _is_block ;
|
|
mutable bool _is_socket ;
|
|
mutable bool _is_fifo ;
|
|
string _path ;
|
|
};
|
|
|
|
|
|
//
|
|
// Inline member functions
|
|
//
|
|
|
|
FilePath &FilePath::operator= ( const string &rhs ) {
|
|
_path = rhs ;
|
|
pruneTrailingSeparator() ;
|
|
return *this ;
|
|
}
|
|
|
|
void FilePath::pruneTrailingSeparator() {
|
|
if ( _path.size() > 0 )
|
|
if ( _path[ _path.size() -1 ] == _separator )
|
|
_path.erase( _path.size() - 1 ) ;
|
|
}
|
|
|
|
FilePath::operator string() const {
|
|
return _path ;
|
|
}
|
|
|
|
|
|
FilePath FilePath::operator+ ( const FilePath &name ) const {
|
|
if ( _path.size() > 0 )
|
|
return _path + _separator + name._path ;
|
|
else
|
|
return name._path ;
|
|
}
|
|
|
|
|
|
FilePath FilePath::filename() const {
|
|
string::size_type pos ;
|
|
pos = _path.find_last_of( _separator ) ;
|
|
if ( pos != string::npos )
|
|
return _path.substr( pos + 1);
|
|
else
|
|
return _path ;
|
|
}
|
|
|
|
|
|
bool FilePath::exists() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _exists ;
|
|
}
|
|
|
|
|
|
bool FilePath::isRegular() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _is_reg ;
|
|
}
|
|
|
|
|
|
bool FilePath::isDirectory() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _is_dir ;
|
|
}
|
|
|
|
|
|
bool FilePath::isCharSpecial() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _is_char ;
|
|
}
|
|
|
|
|
|
bool FilePath::isBlockSpecial() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _is_block ;
|
|
}
|
|
|
|
|
|
bool FilePath::isSocket() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _is_socket ;
|
|
}
|
|
|
|
|
|
bool FilePath::isFifo() const {
|
|
if ( ! _checked )
|
|
check() ;
|
|
return _is_fifo ;
|
|
}
|
|
|
|
|
|
} // namespace
|
|
#endif
|
|
|
|
/** \file
|
|
Header file that defines FilePath.
|
|
*/
|
|
|
|
/*
|
|
Zipios++ - a small C++ library that provides easy access to .zip files.
|
|
Copyright (C) 2000 Thomas Søndergaard
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|