00001 #ifndef         __FILE_UTILITIES_H__
00002 #define         __FILE_UTILITIES_H__
00003 
00004 #include        <sys/stat.h>
00005 #include        <time.h>
00006 
00007 #include        <fstream>
00008 #include        <functional>
00009 
00010 #include        <system/directory_abstraction.h>
00011 #include        <system/file_abstraction.h>
00012 #include        <utilities/binary_data.h>
00013 #include        <utilities/exception.h>
00014 #include        <utilities/string_utilities.h>
00015 #include        <utilities/testing_utilities.h>
00016 
00017 #if !defined( WIN32_PLATFORM ) && !defined( NIX_PLATFORM ) && !defined( MINGW_PLATFORM ) && !defined( CYGWIN_PLATFORM )
00018         #define WIN32_PLATFORM
00019 #endif
00020 
00021 #ifdef FILE_UTILITIES
00022         #if defined( WIN32_PLATFORM ) || defined( MINGW_PLATFORM ) || defined( CYGWIN_PLATFORM )
00023                 #define FILE_UTILITIES_DLL_ENTITY __declspec( dllexport )
00024         #endif
00025 
00026         #if defined( NIX_PLATFORM )
00027                 #define FILE_UTILITIES_DLL_ENTITY
00028         #endif
00029 #else
00030         #ifdef WIN32_PLATFORM
00031                 #define FILE_UTILITIES_DLL_ENTITY __declspec( dllimport )
00032                 #pragma comment( lib , "file_utilities.lib" )
00033         #endif
00034 
00035         #if defined( CYGWIN_PLATFORM ) || defined( MINGW_PLATFORM )
00036                 #define FILE_UTILITIES_DLL_ENTITY __declspec( dllimport )
00037         #endif
00038 
00039         #if defined( NIX_PLATFORM )
00040                 #define FILE_UTILITIES_DLL_ENTITY
00041         #endif
00042 #endif
00043 
00044 namespace nitro
00045 {
00058         class FILE_UTILITIES_DLL_ENTITY File: public nitro::FileAbstraction{
00059 
00060         public:
00061 
00076                 File( void );
00077 
00100                 File( const char * FilePath , const std::size_t Mode );
00101 
00124                 File( const std::string & FilePath , const std::size_t Mode );
00125 
00126                 ALIAS_FUNCTION_2( Open , tstOpen , const char * , std::size_t );
00127                 ALIAS_FUNCTION_0( Close , tstClose );
00128 
00151                 static void                                                                     SaveBinDataToFile( const BinaryData & BinData , const char * Path );
00152 
00175                 static void                                                                     SaveBinDataToFile( const BinaryData & BinData , const std::string & Path );
00176 
00199                 static void                                                                     LoadBinDataFromFile( nitro::BinaryData & BinData , const char * Path );
00200 
00223                 static void                                                                     LoadBinDataFromFile( nitro::BinaryData & BinData , const std::string & Path );
00224 
00247                 static tm                                                                       GetLastModified( const char * Path );
00248 
00271                 static tm                                                                       GetLastModified( const std::string & Path );
00272 
00295                 static bool                                                                     FileExists( const char * FilePath );
00296 
00319                 static bool                                                                     FileExists( const std::string & FilePath );
00320 
00339                 void                                                                            Write( const char * Data );
00340 
00341                 ALIAS_FUNCTION_1( Write , tstWrite , const char * )
00342 
00343                 
00361                 void                                                                            Write( const std::string & Data );
00362 
00381                 static void                                                                     ForceCreateFile( const char * FilePath );
00382 
00401                 static void                                                                     ForceCreateFile( const std::string & FilePath );
00402 
00421                 std::size_t                                                                     FileSize( void );
00422 
00434                 using                                                                           FileAbstraction::Write;
00435 
00436         private:
00437 
00456                 File( const File & File ){}
00457 
00480                 File                                                                            operator=( const File & File ){return( *this );}
00481         };
00482 
00483         ALIAS_FUNCTION_2( File::SaveBinDataToFile , tstSaveBinDataToFile , BinaryData , const char * );
00484 
00485         ALIAS_FUNCTION_2( File::LoadBinDataFromFile , tstLoadBinDataFromFile , BinaryData , const char * );
00486 
00487         ALIAS_FUNCTION_1R( File::FileExists , aliasFileExists , const char * , bool );
00488 
00489         ALIAS_FUNCTION_1( File::ForceCreateFile , aliasForceCreateFile , const char * );
00490 
00491         ALIAS_FUNCTION_1R( File::GetLastModified , aliasGetLastModified , const char * , tm );
00492 
00501         template< class type , class cont >struct CollectFiles : public std::binary_function< type , cont * , void >{
00502         
00525                 void operator()( const type & FilePath , cont * PathsContainer ) const
00526                 {
00527                         PathsContainer->push_back( FilePath );
00528                 }
00529         };
00530 
00539         template< class type , class cont >struct CollectNone : public std::binary_function< type , cont * , void >{
00540         
00563                 void operator()( const type & FilePath , cont * PathsContainer ) const
00564                 {
00565                 }
00566         };
00567 
00598         template< class file_func_type , class directory_func_type >void        WalkThroughDirectory( const std::string & FolderPath , file_func_type FileFunc , directory_func_type DirectoryFunc , const bool Recursive = true )
00599         {
00600                 try
00601                 {
00602                         nitro::DirectoryAbstraction             FileFinder;
00603 
00604                         std::size_t                                             Again( FileFinder.FindFirst( FolderPath ) );
00605 
00606                         while( Again == 0 )
00607                         {
00608                                 if( FileFinder.IsDots() )
00609                                 {
00610                                         Again = FileFinder.FindNext();
00611                                         continue;
00612                                 }
00613                                 
00614                                 if( FileFinder.IsDirectory() )
00615                                 {
00616                                         DirectoryFunc( nitro::FSPath::AddEndSlash( FolderPath ) + FileFinder.GetName() );
00617 
00618                                         if( Recursive )
00619                                         {
00620                                                 WalkThroughDirectory( nitro::FSPath::AddEndSlash( FolderPath ) + FileFinder.GetName() , FileFunc , DirectoryFunc , Recursive );
00621                                         }
00622                                 }
00623                                 else
00624                                 {
00625                                         FileFunc( nitro::FSPath::AddEndSlash( FolderPath ) + FileFinder.GetName() );
00626                                 }
00627 
00628                                 Again = FileFinder.FindNext();
00629                         }
00630                 }
00631                 catch( nitro::exception e )
00632                 {
00633                         throw( nitro::exception( std::string( "template< class file_func_type , class directory_func_type >void WalkThroughDirectory( const std::string & FolderPath , file_func_type FileFunc , directory_func_type DirectoryFunc , const bool Recursive = true )::" ) + e.what() , e.code() ) );
00634                 }
00635                 catch( ... )
00636                 {
00637                         throw( nitro::exception( std::string( "template< class file_func_type , class directory_func_type >void WalkThroughDirectory( const std::string & FolderPath , file_func_type FileFunc , directory_func_type DirectoryFunc , const bool Recursive = true )::An error occured" ) , 0 ) );
00638                 }
00639         }
00640 
00667         template< class cont >void                              CollectFilesFromDirectory( const std::string & FolderPath , cont & c , const bool Recursive = true )
00668         {
00669                 try
00670                 {
00671                         nitro::WalkThroughDirectory( 
00672                                 FolderPath , 
00673                                 std::bind2nd( 
00674                                 nitro::CollectFiles< std::string , std::vector< std::string > >() , & c
00675                                 ) , 
00676                                 std::bind2nd( 
00677                                 nitro::CollectNone< std::string , std::vector< std::string > >() , & c
00678                                 ) , 
00679                                 Recursive
00680                         );
00681                 }
00682                 catch( nitro::exception e )
00683                 {
00684                         throw( nitro::exception( std::string( "template< class cont >void CollectFilesFromDirectory( const std::string & FolderPath , cont & c , const bool Recursive = true )::" ) + e.what() , e.code() ) );
00685                 }
00686                 catch( ... )
00687                 {
00688                         throw( nitro::exception( std::string( "template< class cont >void CollectFilesFromDirectory( const std::string & FolderPath , cont & c , const bool Recursive = true )::An error occured" ) , 0 ) );
00689                 }
00690         }
00691 
00718         template< class cont >void                              CollectDirectoriesFromDirectory( const std::string & FolderPath , cont & c , const bool Recursive = true )
00719         {
00720                 try
00721                 {
00722                         nitro::WalkThroughDirectory( 
00723                                 FolderPath , 
00724                                 std::bind2nd( 
00725                                 nitro::CollectNone< std::string , std::vector< std::string > >() , & c
00726                                 ) , 
00727                                 std::bind2nd( 
00728                                 nitro::CollectFiles< std::string , std::vector< std::string > >() , & c
00729                                 ) , 
00730                                 Recursive
00731                         );
00732                 }
00733                 catch( nitro::exception e )
00734                 {
00735                         throw( nitro::exception( std::string( "template< class cont >void CollectDirectoriesFromDirectory( const std::string & FolderPath , cont & c , const bool Recursive = true )::" ) + e.what() , e.code() ) );
00736                 }
00737                 catch( ... )
00738                 {
00739                         throw( nitro::exception( std::string( "template< class cont >void CollectDirectoriesFromDirectory( const std::string & FolderPath , cont & c , const bool Recursive = true )::An error occured" ) , 0 ) );
00740                 }
00741         }
00742 }
00743 
00744 #endif