source: NonGTP/Boost/boost/filesystem/operations.hpp @ 857

Revision 857, 5.7 KB checked in by igarcia, 18 years ago (diff)
Line 
1//  boost/filesystem/directory.hpp  ------------------------------------------//
2
3//  Copyright © 2002, 2003 Beman Dawes
4//  Copyright © 2002 Jan Langer
5//  Copyright © 2001 Dietmar Kühl                                       
6// 
7//  Use, modification, and distribution is subject to the Boost Software
8//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy
9//  at http://www.boost.org/LICENSE_1_0.txt)                             
10
11//  See library home page at http://www.boost.org/libs/filesystem
12
13//----------------------------------------------------------------------------//
14
15#ifndef BOOST_FILESYSTEM_DIRECTORY_HPP
16#define BOOST_FILESYSTEM_DIRECTORY_HPP
17
18#include <boost/filesystem/path.hpp>  // includes <boost/filesystem/config.hpp>
19#include <boost/shared_ptr.hpp>
20#include <boost/iterator.hpp>
21#include <boost/cstdint.hpp>
22
23#include <string>
24#include <ctime>
25
26#include <boost/config/abi_prefix.hpp> // must be the last header
27
28# ifdef BOOST_NO_STDC_NAMESPACE
29    namespace std { using ::time_t; }
30# endif
31
32//----------------------------------------------------------------------------//
33
34namespace boost
35{
36  namespace filesystem
37  {
38
39//  query functions  ---------------------------------------------------------//
40
41    BOOST_FILESYSTEM_DECL bool exists( const path & ph );
42    BOOST_FILESYSTEM_DECL bool symbolic_link_exists( const path & ph );
43    BOOST_FILESYSTEM_DECL bool is_directory( const path & ph );
44
45    // VC++ 7.0 and earlier has a serious namespace bug that causes a clash
46    // between boost::filesystem::is_empty and the unrelated type trait
47    // boost::is_empty. The workaround for those who must use broken versions
48    // of VC++ is to use the function _is_empty. All others should use the
49    // correct is_empty name.
50    BOOST_FILESYSTEM_DECL bool _is_empty( const path & ph ); // deprecated
51
52#   if !defined( BOOST_MSVC ) || BOOST_MSVC > 1300
53    inline bool is_empty( const path & ph ) { return _is_empty( ph ); }
54#   endif
55
56    BOOST_FILESYSTEM_DECL bool equivalent( const path & ph1, const path & ph2 );
57    BOOST_FILESYSTEM_DECL boost::intmax_t file_size( const path & ph );
58    BOOST_FILESYSTEM_DECL std::time_t last_write_time( const path & ph );
59    BOOST_FILESYSTEM_DECL void last_write_time( const path & ph, const std::time_t new_time );
60
61//  operations  --------------------------------------------------------------//
62
63    BOOST_FILESYSTEM_DECL bool create_directory( const path & directory_ph );
64
65    BOOST_FILESYSTEM_DECL bool remove( const path & ph );
66    BOOST_FILESYSTEM_DECL unsigned long remove_all( const path & ph );
67
68    BOOST_FILESYSTEM_DECL void rename( const path & from_path,
69                 const path & to_path );
70
71    BOOST_FILESYSTEM_DECL void copy_file( const path & from_file_ph,
72                    const path & to_file_ph );
73
74    BOOST_FILESYSTEM_DECL path current_path();
75    BOOST_FILESYSTEM_DECL const path & initial_path();
76
77    BOOST_FILESYSTEM_DECL path system_complete( const path & ph );
78    BOOST_FILESYSTEM_DECL path complete( const path & ph, const path & base = initial_path() );
79
80//  test helper  -------------------------------------------------------------//
81
82    // not part of the documented interface because false positives are possible;
83    // there is no law that says that an OS that has large stat.st_size
84    // actually supports large file sizes.
85    BOOST_FILESYSTEM_DECL bool possible_large_file_size_support();
86
87
88//  directory_iterator helpers  ----------------------------------------------//
89//    forwarding functions avoid need for BOOST_FILESYSTEM_DECL for class
90//    directory_iterator, and so avoid iterator_facade DLL template problems
91    namespace detail
92    {
93      class dir_itr_imp;
94      // shared_ptr provides shallow-copy semantics required for InputIterators
95      typedef boost::shared_ptr< dir_itr_imp > dir_itr_imp_ptr;
96      BOOST_FILESYSTEM_DECL void dir_itr_init( dir_itr_imp_ptr & m_imp,
97                                               const path & dir_path );
98      BOOST_FILESYSTEM_DECL path & dir_itr_dereference(
99                                               const dir_itr_imp_ptr & m_imp );
100      BOOST_FILESYSTEM_DECL void dir_itr_increment( dir_itr_imp_ptr & m_imp );
101    } // namespace detail
102
103//  directory_iterator  ------------------------------------------------------//
104
105    class directory_iterator
106      : public boost::iterator_facade<
107      directory_iterator,
108      path,
109      boost::single_pass_traversal_tag >
110    {
111    public:
112      directory_iterator(){}  // creates the "end" iterator
113      explicit directory_iterator( const path & p )
114        { detail::dir_itr_init( m_imp, p ); }
115
116/*
117The *r++ requirement doesn't appear to apply to the new single_pass_traversal category
118Thus I'm leaving the proxy out pending confirmation from the N1477 authors
119struct path_proxy // allows *r++ to work, as required by 24.1.1
120      {
121        path pv;
122        explicit path_proxy( const path & p ) : pv(p) {}
123        path operator*() const { return pv; }
124      };
125
126      path_proxy operator++(int)
127      {
128        path_proxy pp( m_deref() );
129        ++*this;
130        return pp;
131      }
132*/
133
134    private:
135      detail::dir_itr_imp_ptr  m_imp;
136      friend class boost::iterator_core_access;
137      reference dereference() const
138        { return detail::dir_itr_dereference( m_imp ); }
139      void increment()
140        { detail::dir_itr_increment( m_imp ); }
141      bool equal( const directory_iterator & rhs ) const
142        { return m_imp == rhs.m_imp; }
143    };
144  } // namespace filesystem
145} // namespace boost
146
147
148#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
149#endif // BOOST_FILESYSTEM_DIRECTORY_HPP
Note: See TracBrowser for help on using the repository browser.