library/core/class.filesystem.php
public static function Copy($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755)){
      $result=false;

      if (is_file($source)) {
         if ($dest[strlen($dest)-1]=='/') {
             if (!file_exists($dest)) {
                 cmfcDirectory::makeAll($dest,$options['folderPermission'],true);
             }
             $__dest=$dest."/".basename($source);
         } else {
             $__dest=$dest;
         }
         $result=copy($source, $__dest);
         chmod($__dest,$options['filePermission']);
        
      } elseif(is_dir($source)) {
         if ($dest[strlen($dest)-1]=='/') {
             if ($source[strlen($source)-1]=='/') {
                 //Copy only contents
             } else {
                 //Change parent itself and its contents
                 $dest=$dest.basename($source);
                 @mkdir($dest);
                 chmod($dest,$options['filePermission']);
             }
         } else {
             if ($source[strlen($source)-1]=='/') {
                 //Copy parent directory with new name and all its content
                 @mkdir($dest,$options['folderPermission']);
                 chmod($dest,$options['filePermission']);
             } else {
                 //Copy parent directory with new name and all its content
                 @mkdir($dest,$options['folderPermission']);
                 chmod($dest,$options['filePermission']);
             }
         }

         $dirHandle=opendir($source);
         while($file=readdir($dirHandle))
         {
             if($file!="." && $file!="..")
             {
                  if(!is_dir($source."/".$file)) {
                     $__dest=$dest."/".$file;
                 } else {
                     $__dest=$dest."/".$file;
                 }
                 $result=Gdn_FileSystem::Copy($source."/".$file, $__dest, $options);
             }
         }
         closedir($dirHandle);
        
      } else {
         $result=false;
      }
      return $result;
   }
public static function Copy($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755)){
      $result=false;

      if (is_file($source)) {
         if ($dest[strlen($dest)-1]=='/') {
             if (!file_exists($dest)) {
                 cmfcDirectory::makeAll($dest,$options['folderPermission'],true);
             }
             $__dest=$dest."/".basename($source);
         } else {
             $__dest=$dest;
         }
         $result=copy($source, $__dest);
         chmod($__dest,$options['filePermission']);
        
      } elseif(is_dir($source)) {
         if ($dest[strlen($dest)-1]=='/') {
             if ($source[strlen($source)-1]=='/') {
                 //Copy only contents
             } else {
                 //Change parent itself and its contents
                 $dest=$dest.basename($source);
                 @mkdir($dest);
                 chmod($dest,$options['filePermission']);
             }
         } else {
             if ($source[strlen($source)-1]=='/') {
                 //Copy parent directory with new name and all its content
                 @mkdir($dest,$options['folderPermission']);
                 chmod($dest,$options['filePermission']);
             } else {
                 //Copy parent directory with new name and all its content
                 @mkdir($dest,$options['folderPermission']);
                 chmod($dest,$options['filePermission']);
             }
         }

         $dirHandle=opendir($source);
         while($file=readdir($dirHandle))
         {
             if($file!="." && $file!="..")
             {
                  if(!is_dir($source."/".$file)) {
                     $__dest=$dest."/".$file;
                 } else {
                     $__dest=$dest."/".$file;
                 }
                 $result=Gdn_FileSystem::Copy($source."/".$file, $__dest, $options);
             }
         }
         closedir($dirHandle);
        
      } else {
         $result=false;
      }
      return $result;
   }
public static function Copy ( $ source , $ dest , $ options = array ( 'folderPermission' => 0755 , 'filePermission' => 0755 ) ) { $ result = false ; if ( is_file ( $ source ) ) { if ( $ dest [ strlen ( $ dest ) - 1 ] == '/' ) { if ( ! file_exists ( $ dest ) ) { cmfcDirectory :: makeAll ( $ dest , $ options [ 'folderPermission' ] , true ) ; } $ __dest = $ dest . "/" . basename ( $ source ) ; } else { $ __dest = $ dest ; } $ result = copy ( $ source , $ __dest ) ; chmod ( $ __dest , $ options [ 'filePermission' ] ) ; } elseif ( is_dir ( $ source ) ) { if ( $ dest [ strlen ( $ dest ) - 1 ] == '/' ) { if ( $ source [ strlen ( $ source ) - 1 ] == '/' ) { //Copy only contents } else { //Change parent itself and its contents $ dest = $ dest . basename ( $ source ) ; @ mkdir ( $ dest ) ; chmod ( $ dest , $ options [ 'filePermission' ] ) ; } } else { if ( $ source [ strlen ( $ source ) - 1 ] == '/' ) { //Copy parent directory with new name and all its content @ mkdir ( $ dest , $ options [ 'folderPermission' ] ) ; chmod ( $ dest , $ options [ 'filePermission' ] ) ; } else { //Copy parent directory with new name and all its content @ mkdir ( $ dest , $ options [ 'folderPermission' ] ) ; chmod ( $ dest , $ options [ 'filePermission' ] ) ; } } $ dirHandle = opendir ( $ source ) ; while ( $ file = readdir ( $ dirHandle ) ) { if ( $ file != "." && $ file != ".." ) { if ( ! is_dir ( $ source . "/" . $ file ) ) { $ __dest = $ dest . "/" . $ file ; } else { $ __dest = $ dest . "/" . $ file ; } $ result = Gdn_FileSystem :: Copy ( $ source . "/" . $ file , $ __dest , $ options ) ; } } closedir ( $ dirHandle ) ; } else { $ result = false ; } return $ result ; }
Copy file or folder from source to destination

It can do recursive copy as well and is very smart
It recursively creates the dest file or directory path if there weren't exists
Situtaions :
- Src:/home/test/file.txt ,Dst:/home/test/b ,Result:/home/test/b -> If source was file copy file.txt name with b as name to destination
- Src:/home/test/file.txt ,Dst:/home/test/b/ ,Result:/home/test/b/file.txt -> If source was file Creates b directory if does not exsits and copy file.txt into it
- Src:/home/test ,Dst:/home/ ,Result:/home/test/** -> If source was directory copy test directory and all of its content into dest
- Src:/home/test/ ,Dst:/home/ ,Result:/home/**-> if source was direcotry copy its content to dest
- Src:/home/test ,Dst:/home/test2 ,Result:/home/test2/** -> if source was directoy copy it and its content to dest with test2 as name
- Src:/home/test/ ,Dst:/home/test2 ,Result:->/home/test2/** if source was directoy copy it and its content to dest with test2 as name

@author Sina Salek - http://sina.salek.ws/en/contact
@param $source //file or folder
@param $dest ///file or folder
@param $options //folderPermission,filePermission
@return boolean
Copy file or folder from source to destination