Пример #1
0
HB_BOOL hb_fsCopy( const char * pszSource, const char * pszDest )
{
   HB_BOOL fResult = HB_FALSE;
   PHB_FILE pSrcFile;

   if( ( pSrcFile = hb_fileExtOpen( pszSource, NULL, FO_READ | FO_SHARED | FXO_SHARELOCK, NULL, NULL ) ) != NULL )
   {
      PHB_FILE pDstFile;
      HB_ERRCODE errCode;

      if( ( pDstFile = hb_fileExtOpen( pszDest, NULL, FXO_TRUNCATE | FO_READWRITE | FO_EXCLUSIVE | FXO_SHARELOCK, NULL, NULL ) ) != NULL )
      {
         void * pbyBuffer = hb_xgrab( HB_FSCOPY_BUFFERSIZE );

         for( ;; )
         {
            HB_SIZE nBytesRead;
            if( ( nBytesRead = hb_fileRead( pSrcFile, pbyBuffer, HB_FSCOPY_BUFFERSIZE, -1 ) ) > 0 &&
                nBytesRead != ( HB_SIZE ) FS_ERROR )
            {
               if( nBytesRead != hb_fileWrite( pDstFile, pbyBuffer, nBytesRead, -1 ) )
               {
                  errCode = hb_fsError();
                  break;
               }
            }
            else
            {
               errCode = hb_fsError();
               fResult = errCode == 0;
               break;
            }
         }

         hb_xfree( pbyBuffer );

         hb_fileClose( pDstFile );
      }
      else
         errCode = hb_fsError();

      hb_fileClose( pSrcFile );

      if( fResult )
      {
         HB_FATTR ulAttr;

         if( hb_fileAttrGet( pszSource, &ulAttr ) )
            hb_fileAttrSet( pszDest, ulAttr );
      }
      hb_fsSetError( errCode );
   }

   return fResult;
}
Пример #2
0
static HB_BOOL hb_copyfile( const char * pszSource, const char * pszDest )
{
   HB_BOOL bRetVal = HB_FALSE;
   PHB_FILE pSource;
   PHB_ITEM pError = NULL;

   HB_TRACE( HB_TR_DEBUG, ( "hb_copyfile(%s, %s)", pszSource, pszDest ) );

   do
   {
      pSource = hb_fileExtOpen( pszSource, NULL,
                                FO_READ | FO_SHARED | FO_PRIVATE |
                                FXO_DEFAULTS | FXO_SHARELOCK,
                                NULL, pError );
      if( pSource == NULL )
      {
         pError = hb_errRT_FileError( pError, NULL, EG_OPEN, 2012, pszSource );
         if( hb_errLaunch( pError ) != E_RETRY )
            break;
      }
   }
   while( pSource == NULL );

   if( pError )
   {
      hb_itemRelease( pError );
      pError = NULL;
   }

   if( pSource != NULL )
   {
      PHB_FILE pDest;

      do
      {
         pDest = hb_fileExtOpen( pszDest, NULL,
                                 FO_READWRITE | FO_EXCLUSIVE | FO_PRIVATE |
                                 FXO_TRUNCATE | FXO_DEFAULTS | FXO_SHARELOCK,
                                 NULL, pError );
         if( pDest == NULL )
         {
            pError = hb_errRT_FileError( pError, NULL, EG_CREATE, 2012, pszDest );
            if( hb_errLaunch( pError ) != E_RETRY )
               break;
         }
      }
      while( pDest == NULL );

      if( pError )
      {
         hb_itemRelease( pError );
         pError = NULL;
      }

      if( pDest != NULL )
      {
         HB_UCHAR * buffer;
         HB_SIZE nRead;

         buffer = ( HB_UCHAR * ) hb_xgrab( BUFFER_SIZE );
         bRetVal = HB_TRUE;

         while( ( nRead = hb_fileRead( pSource, buffer, BUFFER_SIZE, -1 ) ) != 0 )
         {
            HB_SIZE nWritten = 0;

            while( nWritten < nRead )
            {
               nWritten += hb_fileWrite( pDest, buffer + nWritten, nRead - nWritten, -1 );
               if( nWritten < nRead )
               {
                  pError = hb_errRT_FileError( pError, NULL, EG_WRITE, 2016, pszDest );
                  if( hb_errLaunch( pError ) != E_RETRY )
                  {
                     bRetVal = HB_FALSE;
                     break;
                  }
               }
            }
         }

         if( pError )
            hb_itemRelease( pError );

         hb_xfree( buffer );

         hb_fileClose( pDest );
      }

      hb_fileClose( pSource );

#if defined( HB_OS_UNIX )
      if( bRetVal )
      {
         HB_FATTR ulAttr;

         if( hb_fileAttrGet( pszSource, &ulAttr ) )
            hb_fileAttrSet( pszDest, ulAttr );
      }
#endif
   }

   return bRetVal;
}