00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 #include "CeylanDirectory.h"
00028 
00029 
00030 #include "CeylanFileSystemManager.h" 
00031 #include "CeylanOperators.h"         
00032 #include "CeylanLogPlug.h"           
00033 
00034 
00035 
00036 #ifdef CEYLAN_USES_CONFIG_H
00037 #include "CeylanConfig.h"            
00038 #endif // CEYLAN_USES_CONFIG_H
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052  
00053 using std::string ;
00054 using std::list ;
00055 
00056 using namespace Ceylan::Log ;
00057 using namespace Ceylan::System ;
00058 
00059 
00060 
00061 DirectoryDelegatingException::DirectoryDelegatingException( 
00062         const string & reason ) :
00063     DirectoryException( reason )
00064 {
00065 
00066 }
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 bool Directory::Exists( const string & directoryPath ) 
00081 {
00082 
00083     
00084     return GetCorrespondingFileSystemManager().existsAsDirectory(
00085         directoryPath ) ;
00086             
00087 }
00088 
00089 
00090 
00091 void Directory::Remove( const string & directoryPath, bool recursive ) 
00092 {
00093 
00094     
00095     return GetCorrespondingFileSystemManager().removeDirectory(
00096         directoryPath, recursive ) ;
00097 
00098 }
00099 
00100 
00101 
00102 void Directory::Move( const string & sourceDirectoryname,
00103     const string & targetDirectoryname )
00104 {
00105 
00106     
00107     return GetCorrespondingFileSystemManager().moveDirectory(
00108         sourceDirectoryname, targetDirectoryname ) ;
00109 
00110 }   
00111 
00112 
00113 
00114 void Directory::Copy( const std::string & sourceDirectoryname,
00115     const std::string & targetDirectoryname )
00116 {
00117 
00118     
00119     return GetCorrespondingFileSystemManager().copyDirectory(
00120         sourceDirectoryname, targetDirectoryname ) ;
00121 
00122 }   
00123     
00124     
00125 
00126 time_t Directory::GetLastChangeTime( const std::string & directoryPath ) 
00127 {
00128 
00129     
00130 
00131 
00132 
00133 
00134     return GetCorrespondingFileSystemManager().getLastChangeTimeDirectory(
00135         directoryPath ) ;
00136 
00137 }   
00138     
00139     
00140                                                                 
00141 bool Directory::IsAValidDirectoryPath( const string & directoryString ) 
00142 {
00143 
00144     
00145     return GetCorrespondingFileSystemManager().isAValidDirectoryPath( 
00146         directoryString ) ;
00147                 
00148 }
00149 
00150     
00151     
00152 void Directory::RemoveLeadingSeparator( std::string & path ) 
00153 
00154 {
00155 
00156     
00157     GetCorrespondingFileSystemManager().removeLeadingSeparator( path ) ;
00158     
00159 }
00160                     
00161     
00162     
00163 bool Directory::IsAbsolutePath( const string & path ) 
00164 {
00165 
00166     
00167     return GetCorrespondingFileSystemManager().isAbsolutePath( path ) ;
00168             
00169 }
00170 
00171 
00172 
00173 string Directory::GetCurrentWorkingDirectoryPath()
00174 {
00175 
00176     
00177     return 
00178         GetCorrespondingFileSystemManager().getCurrentWorkingDirectoryPath() ;
00179         
00180 }
00181 
00182 
00183 
00184 void Directory::ChangeWorkingDirectory( const string & newWorkingDirectory )
00185 {
00186 
00187     
00188     return GetCorrespondingFileSystemManager().changeWorkingDirectory(
00189         newWorkingDirectory ) ;
00190         
00191 }
00192 
00193 
00194 
00195 list<string> Directory::SplitPath( const string & path ) 
00196 {
00197 
00198     
00199     return GetCorrespondingFileSystemManager().splitPath( path ) ;
00200 
00201 }
00202 
00203 
00204 
00205 string Directory::JoinPath( const list<string> & pathElements ) 
00206 {
00207 
00208     
00209     return GetCorrespondingFileSystemManager().joinPath( pathElements ) ;
00210 
00211 }
00212 
00213 
00214 
00215 string Directory::JoinPath( const string & firstPath, 
00216     const std::string & secondPath )
00217 {
00218 
00219     
00220     return GetCorrespondingFileSystemManager().joinPath( firstPath,
00221         secondPath ) ;
00222 
00223 }
00224 
00225 
00226 
00227 void Directory::StripFilename( const string & path, string * base, 
00228     string * file )
00229 {
00230 
00231     
00232     return GetCorrespondingFileSystemManager().stripFilename( path, base,
00233         file ) ;
00234 
00235 }
00236 
00237 
00238 
00239 Ceylan::Latin1Char Directory::GetSeparator()
00240 {
00241 
00242     
00243     return GetCorrespondingFileSystemManager().getSeparator() ; 
00244 
00245 }
00246 
00247 
00248 
00249 string Directory::GetSeparatorAsString()
00250 {
00251 
00252     
00253     return Ceylan::toString( GetSeparator() ) ;
00254 
00255 }
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 Directory & Directory::Create( const string & newDirectoryName ) 
00268 {
00269 
00270     return GetCorrespondingFileSystemManager().createDirectory( 
00271         newDirectoryName ) ;
00272 
00273 }
00274     
00275     
00276                     
00277 Directory & Directory::Open( const string & directoryName ) 
00278 {
00279 
00280     return GetCorrespondingFileSystemManager().openDirectory( 
00281         directoryName ) ;
00282 
00283 }
00284     
00285     
00286     
00287 Directory::~Directory() throw()
00288 {
00289 
00290     
00291 
00292 }
00293 
00294 
00295 
00296 
00297                     
00298 
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 void Directory::goDown( const string & subdirectoryName ) 
00309 {
00310 
00311      
00312     if ( hasEntry( subdirectoryName ) )
00313     {
00314     
00315         try
00316         {
00317     
00318             FileSystemManager & fs = getCorrespondingFileSystemManager() ;
00319     
00320             string candidate = fs.joinPath( _path, subdirectoryName ) ;
00321                 
00322             if ( fs.existsAsDirectory( candidate ) )
00323             {
00324              
00325                 _path = candidate ;
00326                 return ;
00327             
00328             }
00329             else
00330             {
00331             
00332                 throw DirectoryChangeFailed( 
00333                     "Directory::goDown failed for subdirectory '"
00334                     + subdirectoryName + "' from '" + _path + "': '"
00335                     + candidate + "' is not a directory." ) ;
00336             }
00337                 
00338         }   
00339         catch( const DirectoryLookupFailed & e )
00340         {
00341         
00342             throw DirectoryChangeFailed( 
00343                 "Directory::goDown failed for subdirectory '"
00344                 + subdirectoryName + "' from '" + _path + "': " 
00345                 + e.toString() ) ;
00346         }       
00347         catch( const DirectoryDelegatingException & e )
00348         {
00349         
00350             throw DirectoryChangeFailed( "Directory::goDown failed: " 
00351                 + e.toString() ) ;
00352         }       
00353 
00354     }
00355     
00356     throw DirectoryChangeFailed( 
00357         "Directory::goDown failed for non-existent subdirectory '"
00358         + subdirectoryName + "' from '" + _path ) ;
00359     
00360 }
00361 
00362 
00363 
00364 bool Directory::isValid() const
00365 {
00366 
00367     
00368 
00369 
00370 
00371 
00372     return getCorrespondingFileSystemManager().existsAsDirectory( _path ) ;
00373 
00374 }
00375 
00376 
00377 
00378 const std::string & Directory::getPath() const
00379 {
00380 
00381     return _path ;
00382     
00383 }
00384 
00385 
00386 
00387 void Directory::removeLeadingSeparator()
00388 {
00389     
00390     
00391 
00392 
00393 
00394 
00395     return getCorrespondingFileSystemManager().removeLeadingSeparator( _path ) ;
00396 
00397 }
00398 
00399 
00400 
00401 const string Directory::toString( Ceylan::VerbosityLevels level ) const
00402 {
00403 
00404     return "Abstract directory referring to path '" + _path + "'" ;
00405     
00406 }
00407 
00408 
00409 
00410 
00411 
00412 
00413 
00414 
00415 
00416 
00417 Directory::Directory( const string & directoryName ) :
00418     _path( directoryName )
00419 {
00420 
00421     
00422 
00423 
00424 
00425 
00426 
00427 
00428     
00429 }
00430 
00431 
00432 
00433 FileSystemManager & Directory::GetCorrespondingFileSystemManager()
00434 {
00435 
00436     
00437 
00438 
00439 
00440 
00441     
00442     try
00443     {
00444     
00445         return FileSystemManager::GetAnyDefaultFileSystemManager() ;
00446     
00447     }
00448     catch( const FileSystemManagerException & e )
00449     {
00450         throw DirectoryDelegatingException(
00451             "Directory::GetCorrespondingFileSystemManager failed: "
00452             + e.toString() ) ;
00453     }
00454     
00455     
00456 }
00457