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