home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 May / Pcwk5b98.iso / Borland / Cplus45 / BC45 / CLASSSRC.PAK / FILE.CPP < prev    next >
Text File  |  1995-08-29  |  8KB  |  266 lines

  1. /*------------------------------------------------------------------------*/
  2. /*                                                                        */
  3. /*  FILE.CPP                                                              */
  4. /*                                                                        */
  5. /*  Copyright (c) 1993, 1994 Borland International                        */
  6. /*  All Rights Reserved                                                   */
  7. /*                                                                        */
  8. /*------------------------------------------------------------------------*/
  9.  
  10. #if !defined( __LIMITS_H )
  11. #include <limits.h>
  12. #endif
  13.  
  14. #if !defined( __DIR_H )
  15. #include <dir.h>
  16. #endif
  17.  
  18. #if !defined( __DOS_H )
  19. #include <dos.h>
  20. #endif
  21.  
  22. #if !defined( __IOSTREAM_H )
  23. #include <iostream.h>
  24. #endif
  25.  
  26. #if !defined( CLASSLIB_DEFS_H )
  27. #include <classlib/defs.h>
  28. #endif
  29.  
  30. #if defined( BI_PLAT_OS2 ) && !defined( __OS2_H )
  31. #define INCL_BASE
  32. #include <os2.h>
  33. #endif
  34.  
  35. #if defined( BI_PLAT_WIN32 ) && !defined( __WINDOWS_H )
  36. #include <windows.h>
  37. #endif
  38.  
  39. #if !defined( CLASSLIB_FILE_H )
  40. #include <classlib/file.h>
  41. #endif
  42.  
  43. int TFile::Open( const char _BIDSFAR *name, uint16 access, uint16 permission )
  44. {
  45.     const unsigned shareFlags =
  46.         Compat | DenyNone | DenyRead | DenyWrite | DenyRdWr | NoInherit;
  47.     if( IsOpen() )
  48.         return 0;
  49.     Handle = ::sopen( name,
  50.                       access & ~shareFlags,
  51.                       access & shareFlags,
  52.                       permission );
  53.     return IsOpen();
  54. }
  55.  
  56. int TFile::Close()
  57. {
  58.     if( IsOpen() && ::close(Handle) == 0) 
  59.         {
  60.         Handle = FileNull;
  61.         return 1;
  62.         }
  63.     else
  64.         return 0;
  65. }
  66.  
  67. long TFile::Length() const
  68. {
  69.     return ::filelength( Handle );
  70. }
  71.  
  72. #if !defined( __OS2__ )
  73. int TFile::GetStatus( TFileStatus _BIDSFAR & status ) const
  74. {
  75.     struct ftime ftime;
  76.     if( ::getftime(Handle, &ftime) != 0 )
  77.         return 0;
  78.     TDate fileDate( ftime.ft_day, ftime.ft_month, ftime.ft_year+80 );
  79.     status.createTime = TTime( fileDate,
  80.                                ftime.ft_hour,
  81.                                ftime.ft_min,
  82.                                ftime.ft_tsec*2 );
  83.     status.modifyTime = status.createTime;
  84.     status.accessTime = status.createTime;
  85.     status.size = Length();
  86.     status.attribute = 0;
  87.     status.fullName[0] = '\0';
  88.     return 1;
  89. }
  90. #else
  91.  
  92. TTime MakeTTime( FDATE fdate, FTIME ftime )
  93. {
  94.     TDate fileDate( fdate.day, fdate.month, fdate.year );
  95.     return TTime( fileDate, ftime.hours, ftime.minutes, ftime.twosecs*2 );
  96. }
  97.  
  98. int TFile::GetStatus( TFileStatus _BIDSFAR& status ) const
  99. {
  100.     FILESTATUS stat;
  101.     if( ::DosQueryFileInfo( Handle, FIL_STANDARD, &stat, sizeof(stat) ) != 0 )
  102.         return 0;
  103.     status.createTime = MakeTTime( stat.fdateCreation, stat.ftimeCreation );
  104.     status.modifyTime = MakeTTime( stat.fdateLastWrite, stat.ftimeLastWrite );
  105.     status.accessTime = MakeTTime( stat.fdateLastAccess, stat.ftimeLastAccess );
  106.     status.size = stat.cbFile;
  107.     status.attribute = stat.attrFile;
  108.     status.fullName[0] = '\0';
  109.     return 1;
  110. }
  111. #endif
  112.  
  113. struct dos_ftime
  114. {
  115.     unsigned tsec : 5;
  116.     unsigned min  : 6;
  117.     unsigned hour : 5;
  118. };
  119.  
  120. struct dos_fdate
  121. {
  122.     unsigned day  : 5;
  123.     unsigned mon  : 4;
  124.     unsigned year : 7;
  125. };
  126.  
  127. #if !defined( __OS2__ )
  128. int TFile::GetStatus( const char _BIDSFAR *name,
  129.                       TFileStatus _BIDSFAR & status )
  130. {
  131.     if( ::_fullpath( status.fullName, name, sizeof(status.fullName) ) == 0 )
  132.         {
  133.         status.fullName[0] = '\0';
  134.         return 0;
  135.         }
  136.     ffblk blk;
  137.     const uint16 FA_ALL = FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
  138.                           FA_LABEL | FA_DIREC | FA_ARCH;
  139.     if( findfirst( status.fullName, &blk, FA_ALL ) != 0 )
  140.         return 0;
  141.  
  142.     union
  143.     {
  144.         dos_ftime time;
  145.         dos_fdate date;
  146.         unsigned value;
  147.     };
  148.  
  149.     value = blk.ff_fdate;
  150.     TDate fileDate( date.day, date.mon, date.year+80 );
  151.     value = blk.ff_ftime;
  152.     status.createTime = TTime( fileDate,
  153.                                  time.hour,
  154.                                  time.min,
  155.                                  time.tsec*2 );
  156.     
  157.     status.modifyTime = status.createTime;
  158.     status.accessTime = status.createTime;
  159.     status.size = blk.ff_fsize;
  160.     status.attribute = blk.ff_attrib;
  161.     return 1;
  162. }
  163. #else
  164. int TFile::GetStatus( const char _BIDSFAR *name,
  165.                       TFileStatus _BIDSFAR & status )
  166. {
  167.     if( ::_fullpath( status.fullName, name, sizeof(status.fullName) ) == 0 )
  168.         {
  169.         status.fullName[0] = '\0';
  170.         return 0;
  171.         }
  172.     const uint16 FA_ALL = FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
  173.                           FA_LABEL | FA_DIREC | FA_ARCH;
  174.     HDIR Handle;
  175.     FILEFINDBUF stat;
  176.     ULONG count;
  177.     if( ::DosFindFirst( status.fullName,
  178.                         &Handle,
  179.                         FA_ALL,
  180.                         &stat,
  181.                         sizeof(stat),
  182.                         &count,
  183.                         0 ) != 0 )
  184.         {
  185.         status.fullName[0] = '\0';
  186.         return 0;
  187.         }
  188.         
  189.     status.createTime = MakeTTime( stat.fdateCreation, stat.ftimeCreation );
  190.     status.modifyTime = MakeTTime( stat.fdateLastWrite, stat.ftimeLastWrite );
  191.     status.accessTime = MakeTTime( stat.fdateLastAccess, stat.ftimeLastAccess );
  192.     status.size = stat.cbFile;
  193.     status.attribute = stat.attrFile;
  194.     return 1;
  195. }
  196. #endif
  197.  
  198. #if !defined( __OS2__ )
  199. int TFile::SetStatus( const char _BIDSFAR *name,
  200.                       const TFileStatus _BIDSFAR & status )
  201. {
  202.     int attr = ::_rtl_chmod( name, 0 );
  203.     if( attr & TFile::RdOnly )
  204.         return 0;
  205.  
  206.     ftime fileTime;
  207.     fileTime.ft_tsec = status.createTime.Second()/2;
  208.     fileTime.ft_min = status.createTime.Minute();
  209.     fileTime.ft_hour = status.createTime.Hour();
  210.     TDate date( status.createTime );
  211.     fileTime.ft_day = date.DayOfMonth();
  212.     fileTime.ft_month = date.Month();
  213.     fileTime.ft_year = date.Year()-80;
  214.  
  215.     TFile file( name, ReadWrite | DenyWrite );
  216.     if( ::setftime( file.GetHandle(), &fileTime ) != 0 )
  217.         return 0;
  218.     if( ::chsize( file.GetHandle(), status.size ) != 0 )
  219.         return 0;
  220.     if( ::_rtl_chmod( name, 1, status.attribute ) == -1 )
  221.         return 0;
  222.     return 1;
  223. }
  224. #else
  225.  
  226. FDATE MakeFDATE( TTime time )
  227. {
  228.     FDATE fdate;
  229.     fdate.day = TDate(time).Day();
  230.     fdate.month = TDate(time).Month();
  231.     fdate.year = TDate(time).Year();
  232.     return fdate;
  233. }
  234.  
  235. FTIME MakeFTIME( TTime time )
  236. {
  237.     FTIME ftime;
  238.     ftime.hours = time.Hour();
  239.     ftime.minutes = time.Minute();
  240.     ftime.twosecs = time.Second()/2;
  241.     return ftime;
  242. }
  243.  
  244. int TFile::SetStatus( const char _BIDSFAR *name,
  245.                       const TFileStatus _BIDSFAR & status )
  246. {
  247.     FILESTATUS stat;
  248.     stat.fdateCreation = MakeFDATE( status.createTime );
  249.     stat.ftimeCreation = MakeFTIME( status.createTime );
  250.     stat.fdateLastAccess = MakeFDATE( status.accessTime );
  251.     stat.ftimeLastAccess = MakeFTIME( status.accessTime );
  252.     stat.fdateLastWrite = MakeFDATE( status.modifyTime );
  253.     stat.ftimeLastWrite = MakeFTIME( status.modifyTime );
  254.     stat.cbFile = status.size;
  255.     stat.cbFileAlloc = status.size;
  256.     stat.attrFile = status.attribute;
  257.     TFile file( name, ReadWrite | DenyWrite );
  258.     return ::DosSetFileInfo( file.GetHandle(),
  259.                              FIL_STANDARD,
  260.                              &stat,
  261.                              sizeof(stat) );
  262. }
  263. #endif
  264.  
  265. 
  266.