Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Filesystem Functions : copy

copy

Copies file (PHP 4, PHP 5)
bool copy ( string source, string dest [, resource context] )

Makes a copy of the file source to dest.

If you wish to move a file, use the rename() function.

Parameters

source

Path to the source file.

dest

The destination path. If dest is a URL, the copy operation may fail if the wrapper does not support overwriting of existing files.

Warning:

If the destination file already exists, it will be overwritten.

context

A valid context resource created with stream_context_create().

Return Values

Returns TRUE on success or FALSE on failure.

ChangeLog

Version Description
5.3.0 Added context support.
4.3.0 Both source and dest may now be URLs if the "fopen wrappers" have been enabled. See fopen() for more details.

Examples

Example 620. copy() example

<?php
$file
= 'example.txt';
$newfile = 'example.txt.bak';

if (!
copy($file, $newfile)) {
   echo
"failed to copy $file...\n";
}
?>


See Also
move_uploaded_file()
rename()
The section of the manual about handling file uploads

Related Examples ( Source code ) » copy
















Code Examples / Notes » copy

mzheng

[Updated] A more efficient dircopy function that provides webfarm sync support. :)
<?php
/* Copies a dir to another. Optionally caching the dir/file structure, used to synchronize similar destination dir (web farm).
*
* @param $src_dir str Source directory to copy.
* @param $dst_dir str Destination directory to copy to.
* @param $verbose bool Show or hide file copied messages
* @param $use_cached_dir_trees bool Set to true to cache src/dst dir/file structure. Used to sync to web farms
* (avoids loading the same dir tree in web farms; making sync much faster).
* @return Number of files copied/updated.
* @example
* To copy a dir:
* dircopy("c:\max\pics", "d:\backups\max\pics");
*
* To sync to web farms (webfarm 2 to 4 must have same dir/file structure (run once with cache off to make sure if necessary)):
* dircopy("//webfarm1/wwwroot", "//webfarm2/wwwroot", false, true);
* dircopy("//webfarm1/wwwroot", "//webfarm3/wwwroot", false, true);
* dircopy("//webfarm1/wwwroot", "//webfarm4/wwwroot", false, true);
*/
function dircopy($src_dir, $dst_dir, $verbose = false, $use_cached_dir_trees = false)
{
static $cached_src_dir;
static $src_tree;
static $dst_tree;
$num = 0;
if (($slash = substr($src_dir, -1)) == "\\" || $slash == "/") $src_dir = substr($src_dir, 0, strlen($src_dir) - 1);
if (($slash = substr($dst_dir, -1)) == "\\" || $slash == "/") $dst_dir = substr($dst_dir, 0, strlen($dst_dir) - 1);  
if (!$use_cached_dir_trees || !isset($src_tree) || $cached_src_dir != $src_dir)
{
$src_tree = get_dir_tree($src_dir);
$cached_src_dir = $src_dir;
$src_changed = true;  
}
if (!$use_cached_dir_trees || !isset($dst_tree) || $src_changed)
$dst_tree = get_dir_tree($dst_dir);
if (!is_dir($dst_dir)) mkdir($dst_dir, 0777, true);  
  foreach ($src_tree as $file => $src_mtime)
{
if (!isset($dst_tree[$file]) && $src_mtime === false) // dir
mkdir("$dst_dir/$file");
elseif (!isset($dst_tree[$file]) && $src_mtime || isset($dst_tree[$file]) && $src_mtime > $dst_tree[$file])  // file
{
if (copy("$src_dir/$file", "$dst_dir/$file"))
{
if($verbose) echo "Copied '$src_dir/$file' to '$dst_dir/$file'
\r\n";
touch("$dst_dir/$file", $src_mtime);
$num++;
} else
echo "<font color='red'>File '$src_dir/$file' could not be copied!</font>
\r\n";
}
}
return $num;
}
/* Creates a directory / file tree of a given root directory
*
* @param $dir str Directory or file without ending slash
* @param $root bool Must be set to true on initial call to create new tree.
* @return Directory & file in an associative array with file modified time as value.
*/
function get_dir_tree($dir, $root = true)
{
static $tree;
static $base_dir_length;
if ($root)
{
$tree = array();  
$base_dir_length = strlen($dir) + 1;  
}
if (is_file($dir))
{
//if (substr($dir, -8) != "/CVS/Tag" && substr($dir, -9) != "/CVS/Root"  && substr($dir, -12) != "/CVS/Entries")
$tree[substr($dir, $base_dir_length)] = filemtime($dir);
} elseif (is_dir($dir) && $di = dir($dir)) // add after is_dir condition to ignore CVS folders: && substr($dir, -4) != "/CVS"
{
if (!$root) $tree[substr($dir, $base_dir_length)] = false;  
while (($file = $di->read()) !== false)
if ($file != "." && $file != "..")
get_dir_tree("$dir/$file", false);  
$di->close();
}
if ($root)
return $tree;
}
?>


kadnan

you can also try xcopy command by using Shell to move/copy files/folders from one place to another
here is the code:
<?php
exec('xcopy c:\\myfolder d:\\myfolder /e/i', $a, $a1);
?>
by executing this command, it will move folder along with all contents to destination.
-adnan


denis

You can also try to copy with:
<?
exec("cp -r /var/www/mysite /var/backup");
?>


info

When using copy on win32 (don't know about anywhere else),  copy sets the 'last modified time' of the the new copy to the current time instead of that of the source (win32 copy preserves last modified time).  If you are tracking backups by last modified time, use:
<?php
copy($src, $dest); touch($dest, filemtime($src));
?>


belandi

To use the previous function on UNIX systems you should change these lines:
      $srcfile = $srcdir . '\\' . $file;
      $dstfile = $dstdir . '\\' . $file;
To match the following:
      $srcfile = $srcdir . DIRECTORY_SEPARATOR . $file;
      $dstfile = $dstdir . DIRECTORY_SEPARATOR . $file;


sboisvert

to the editor's: Please pardon me.... remove my other 2 messages and this little comment and just stick this.
just a quick note to add to the great function by:bobbfwed at comcast dot net
this little version has the path not in a define but as a function parameter and also creates the destination directory if it is not already created.
<?php
 // copy a directory and all subdirectories and files (recursive)
 // void dircpy( str 'source directory', str 'destination directory' [, bool 'overwrite existing files'] )
function dircpy($basePath, $source, $dest, $overwrite = false){
if(!is_dir($basePath . $dest)) //Lets just make sure our new folder is already created. Alright so its not efficient to check each time... bite me
mkdir($basePath . $dest);
if($handle = opendir($basePath . $source)){        // if the folder exploration is sucsessful, continue
while(false !== ($file = readdir($handle))){ // as long as storing the next file to $file is successful, continue
if($file != '.' && $file != '..'){
$path = $source . '/' . $file;
if(is_file($basePath . $path)){
if(!is_file($basePath . $dest . '/' . $file) || $overwrite)
if(!@copy($basePath . $path, $basePath . $dest . '/' . $file)){
echo '<font color="red">File ('.$path.') could not be copied, likely a permissions problem.</font>';
}
} elseif(is_dir($basePath . $path)){
if(!is_dir($basePath . $dest . '/' . $file))
mkdir($basePath . $dest . '/' . $file); // make subdirectory before subdirectory is copied
dircpy($basePath, $path, $dest . '/' . $file, $overwrite); //recurse!
}
}
}
closedir($handle);
}
}
?>


mspreij

This function creates a new filename to use for a copy of the given filename, its behaviour was mostly sto^Wborrowed from how the OS X Finder (*1) does it.
Note it *doesn't* actually copy the file, it just returns the new name. I needed it to work regardless of data source (filesystem, ftp, etc).
It also tries to match the current name as neatly as possible:
foo.txt -> foo copy.txt -> foo copy 1.txt -> foo copy 2.txt [etc]
foo.bar.baz.jpg -> foo.bar.baz copy.jpg
foobar -> foobar copy -> foobar copy 1 [etc]
".txt" -> .txt copy, and "txt." -> txt. copy
file.longextension -> file.longextension copy
It keeps trying until it finds a name that is not yet taken in $list, or until it looped 500 times (change as needed).
If the renamed file becomes longer than max filename length, it starts chopping away at the end of the part before where it adds " copy": reallylong...filename.txt -> reallylong...filena copy.txt
<?php
// $orig = current name, of course
// $list = array of filenames in the target directory (if none given, it will still return a new name)
// $max = max length of filename
function duplicate_name($orig, $list = array(), $max = 64) {
 $ext = '';
 $counter = 0;
 $list = (array) $list;
 $max = (int) $max;
 $newname = $orig;
 do {
   $name = $newname; # name in, newname out
   if (preg_match('/ copy$| copy \d+$/', $name, $matches)) {
     // don't even check for extension, name ends with " copy[ digits]"
   // preg hereunder matches anything with at least one period in the middle (that is,
   // non-period characters on either side), and an extension of 1-5 characters
   }elseif (preg_match('/(.+)\.([^.]{1,5})$/', $name, $parts)) {
     // split to name & extension
     list($name, $ext) = array($parts[1], $parts[2]);
   }
   if (preg_match('/ copy (\d+)$/', $name, $digits)) {
     $newname = substr($name, 0, - strlen($digits[1])) . ($digits[1] + 1);
     # $cutlen is only used for the bit at the end where it checks on max filename length
     $cutlen = 6 + strlen($digits[1]+1); // ' copy ' + digits
   }elseif(preg_match('/ copy$/', $name, $digits)) {
     $newname = $name . ' 1';
     $cutlen = 7; // ' copy' + ' 1'
   }else{
     $newname = $name . ' copy';
     $cutlen = 5; // ' copy'
   }
   if ($ext) {
     $newname .= '.' . $ext;
     $cutlen += strlen($ext) + 1;
   }
   if ($max > 0) {
     if (strlen($newname) > $max) {
       $newname = substr($newname, 0, max($max - $cutlen, 0)) . substr($newname, -$cutlen);
       if (strlen($newname) > $max) {echo "duplicate_name() error: Can't keep the new name under given max length.\n"; return false;}
     }
   }
   if ($counter++ > 500) {echo "duplicate_name() error: Too many similarly named files or infinite while loop.\n"; return false;}
 } while (in_array($newname, $list));
 return $newname;
}
?>
*1) The Finder seems to check the extension vs a list of known extensions, this function considers it valid if it's 5 or fewer characters long.
ps. sorry for taking up so much space! :-)


andrzej nadziejko andrzej

These functions are to copy and remove big directories:
/*
source files are in source directory
*/
function SetupFolder($dir_name)
{
mkdir($dir_name,'0777');
$folder = opendir('source');
while($file = readdir($folder))
{
if ($file == '.' || $file == '..') {
           continue;
       }
       if(is_dir('source/'.$file))
       {
        mkdir($dir_name.'/'.$file,0777);
        CopyFiles('source/'.$file,$dir_name.'/'.$file);
       }
       else
       {
        copy('source/'.$file,$dir_name.'/'.$file);
       }
}
closedir($folder);
return 1;
}
//copy many files
function CopyFiles($source,$dest)
{
$folder = opendir($source);
while($file = readdir($folder))
{
if ($file == '.' || $file == '..') {
           continue;
       }
       
       if(is_dir($source.'/'.$file))
       {
        mkdir($dest.'/'.$file,0777);
        CopySourceFiles($source.'/'.$file,$dest.'/'.$file);
       }
       else
       {
        copy($source.'/'.$file,$dest.'/'.$file);
       }
       
}
closedir($folder);
return 1;
}
//remove file, directories, subdirectories
function RemoveFiles($source)
{
$folder = opendir($source);
while($file = readdir($folder))
{
if ($file == '.' || $file == '..') {
           continue;
       }
       
       if(is_dir($source.'/'.$file))
       {
        RemoveFiles($source.'/'.$file);
       }
       else
       {
        unlink($source.'/'.$file);
       }
       
}
closedir($folder);
rmdir($source);
return 1;
}


fred dot haab

Just some caveats for people to consider when working with this copy function.  Like everyone else, I needed a recursive copy function, so I wrote one.
It worked great until I hit a file greater than 2GB, at which point I got a File Size Exceeded error.  I've read that you can recompile PHP with larger file support, but I'm not able to do this on my system.
So I used exec to copy one file at a time (I need to do other things to the file, so can't just do an exec with "cp -r").  Then I ran into problems with spaces in the names.  The escapeshellcmd and escapeshellargs functions don't seem to cleanup spaces, so I wrote my own function to do that.


cooper

It take me a long time to find out what the problem is when i've got an error on copy(). It DOESN'T create any directories. It only copies to existing path. So create directories before. Hope i'll help,

jtaylor -at- ashevillenc -dot- com

It seems as though you can only use move_uploaded_file() once on a temporary file that has been uploaded through a form. Most likely the action this function takes destroys the temporary file after it has been moved, assuming permanent placement on a file system.
Attempting to use the function again in the same PHP script will return false and not move the file.
I ran into this when an image that was uploaded did not need resizing (smaller than a size threshold) and after moving the temporary upload to the "originals" directory, an attempt was made to again move the temporary file to another folder.
This behavior is understandable, but be careful - in this instance, I simply used copy() on the file that was already uploaded.


aidan

If you want to copy a file, or an entire folder (including the contents), use the below function.
http://aidanlister.com/repos/v/function.copyr.php


bobbfwed

I have programmed a really nice program that remotely lets you manage files as if you have direct access to them (http://sourceforge.net/projects/filemanage/). I have a bunch of really handy functions to do just about anything to files or directories.
I know there are others like it, but here is the function I made for this program to copy directories; it will likely need tweaking to work as a standalone script, since it relies of variables set by my program (eg: loc1 -- which dynamically changes in my program):
<?PHP
 // loc1 is the path on the computer to the base directory that may be moved
define('loc1', 'C:/Program Files/Apache Group/Apache/htdocs', true);
 // copy a directory and all subdirectories and files (recursive)
 // void dircpy( str 'source directory', str 'destination directory' [, bool 'overwrite existing files'] )
function dircpy($source, $dest, $overwrite = false){
 if($handle = opendir(loc1 . $source)){         // if the folder exploration is sucsessful, continue
   while(false !== ($file = readdir($handle))){ // as long as storing the next file to $file is successful, continue
     if($file != '.' && $file != '..'){
       $path = $source . '/' . $file;
       if(is_file(loc1 . $path)){
         if(!is_file(loc1 . $dest . '/' . $file) || $overwrite)
           if(!@copy(loc1 . $path, loc1 . $dest . '/' . $file)){
             echo '<font color="red">File ('.$path.') could not be copied, likely a permissions problem.</font>';
           }
       } elseif(is_dir(loc1 . $path)){
         if(!is_dir(loc1 . $dest . '/' . $file))
           mkdir(loc1 . $dest . '/' . $file); // make subdirectory before subdirectory is copied
         dircpy($path, $dest . '/' . $file, $overwrite); //recurse!
       }
     }
   }
   closedir($handle);
 }
} // end of dircpy()
?>
This new function will be in 0.9.7 (the current release of File Manage) which has just been released 2/2/06.
Hope this helps some people.


emielm

I have been puzzling for hours with the copy() function. I got a "no such file or directory" error message all the time (for the source file). In the end my mistake was that there were some spaces at the end of de source filename...
So, if you get file not found errors and you are sure that the file does exists, use the trim() function to get rid of the spaces.


20-jan-2005 12:34

Heres a quick function I wrote to backup whole websites.
I haven't actually tested it out yet. I will later on  =P
<?
function backup($extension) {
$counter = 0;
foreach(glob(“*” . “$extension”) as $file) {
if ($extension{0} != “.”) {
$extension = “.” . $extension;
}
$file2 = “./backup/” . “$file”;
$counter++;
copy($file, $file2);
}
if ($counter == 0) {
return false;
} else {
return true;
}
}
/* Test -- Copy all images */
$extension_array = array(“.jpg”, “.gif”, “.png”, “.bmp”);
foreach($extension_array as $key => $value) {
backup($extension);
}
?>


swizec

Here's another recursive copy function. Unlike the others this one relies on the built-in dir class and is thus much cleaner and simpler.
<?php
function full_copy( $source, $target )
{
if ( is_dir( $source ) )
{
@mkdir( $target );

$d = dir( $source );

while ( FALSE !== ( $entry = $d->read() ) )
{
if ( $entry == '.' || $entry == '..' )
{
continue;
}

$Entry = $source . '/' . $entry;
if ( is_dir( $Entry ) )
{
full_copy( $Entry, $target . '/' . $entry );
continue;
}
copy( $Entry, $target . '/' . $entry );
}

$d->close();
}else
{
copy( $source, $target );
}
}
?>


flo somekindofitem.com

here is a a function to move a file clean and safe:
function file_move ($quelle, $ziel)
{
// kopiert datei und loescht sie danach
$fertigverschoben = 4;
if (file_exists($quelle))
{
$fertigverschoben--;
if (!file_exists($ziel))
{
$fertigverschoben--;
if (copy ($quelle, $ziel))
{
$fertigverschoben--;
if (unlink ($quelle)) $fertigverschoben--;
else unlink ($ziel);
}
}
}
return $fertigverschoben;
// gibt errorcode zurueck,
// 0 = alles okay,
// 1 = konnte quelle nicht loeschen,
// 2 = konnte ziel nicht erstellen (copy),
// 3 = ziel existiert bereits,
// 4 = quelle nicht gefunden
}// ende file_move


mspreij

hello editor, could you please fix my previous post..
   # preg hereunder matches anything with at least one period in the middle (that is,
   # non-period characters on either side), and an extension of 1-5 characters
changes to
   # preg hereunder matches anything with at least one period in the middle and an extension of 1-5 characters
Sorry!


simonr_at_orangutan_dot_co_dot_uk

Having spent hours tacking down a copy() error: Permission denied , (and duly worrying about chmod on winXP) , its worth pointing out that the 'destination' needs to contain the actual file name ! --- NOT just the path to the folder you wish to copy into.......
DOH !
hope this saves somebody hours of fruitless debugging


matthew j

A useful use for copy is when uploading files.
getUpload( [The name given to the file element in the form], [the location to copy the upload to], [an alternative name], [what you want the file chmod'd to] )
returns true or false.
<?php
function getUpload($name,$location,$fname='',$chmod=''){
$upload=$_FILES[$name];
if($fname==''){$fname=$upload['name'];}
if($chmod==''){$chmod="0777";}
$c=@copy($upload['tmp_name'],$location.$fname);
$m=@chmod($location.$fname,$chmod);
if(!$c||!$m){return(true);}else{return(false);}
}
?>


max zheng

A more efficient dircopy function that provides webfarm sync support. :)
<?php
/* Copies a dir to another. Optionally caching the dir/file structure, used to synchronize similar destination dir (web farm).
*
* @param $src_dir str Source directory to copy (without ending slash).
* @param $dst_dir str Destination directory to copy to (without ending slash).
* @param $verbose bool Show or hide file copied messages
* @param $use_cached_dir_trees bool Set to true to cache src/dst dir/file structure. Used to sync to web farms
* (avoids loading the same dir tree in web farms; making sync much faster).
* @return Number of files copied/updated.
* @example
* To copy a dir:
* dircopy("c:\max\pics", "d:\backups\max\pics");
*
* To sync to web farms (webfarm 2 to 4 must have same dir/file structure (run once with cache off to make sure if necessary)):
* dircopy("//webfarm1/wwwroot", "//webfarm2/wwwroot", false, true);
* dircopy("//webfarm1/wwwroot", "//webfarm3/wwwroot", false, true);
* dircopy("//webfarm1/wwwroot", "//webfarm4/wwwroot", false, true);
*/
function dircopy($src_dir, $dst_dir, $verbose = false, $use_cached_dir_trees = false)
{
$num = 0;
static $cached_src_dir;
static $src_tree;
static $dst_tree;
if (!$use_cached_dir_trees || !isset($src_tree) || $cached_src_dir != $src_dir)
{
$src_tree = get_dir_tree($src_dir);
$cached_src_dir = $src_dir;
}
if (!$use_cached_dir_trees || !isset($dst_tree))
{
$dst_tree = get_dir_tree($dst_dir);
if (!is_dir($dst_dir)) mkdir($dst_dir, 0777, true);  
}
  foreach ($src_tree as $file => $src_mtime)
{
if (!isset($dst_tree[$file]) && $src_mtime === false) // dir
mkdir("$dst_dir/$file");
elseif (!isset($dst_tree[$file]) && $src_mtime || isset($dst_tree[$file]) && $src_mtime > $dst_tree[$file])  // file
{
if (copy("$src_dir/$file", "$dst_dir/$file"))
{
if($verbose) echo "Copied '$src_dir/$file' to '$dst_dir/$file'
\r\n";
touch("$dst_dir/$file", $src_mtime);
$num++;
} else
echo "<font color='red'>File '$src_dir/$file' could not be copied!</font>
\r\n";
}
}
return $num;
}
/* Creates a directory / file tree of a given root directory
*
* @param $dir str Directory or file without ending slash
* @param $root bool Must be set to true on initial call to create new tree.
* @return Directory & file in an associative array with file modified time as value.
*/
function get_dir_tree($dir, $root = true)
{
static $tree;
static $base_dir_length;
if ($root)
{
$tree = array();  
$base_dir_length = strlen($dir) + 1;  
}
if (is_file($dir))
{
//if (substr($dir, -8) != "/CVS/Tag" && substr($dir, -9) != "/CVS/Root"  && substr($dir, -12) != "/CVS/Entries")
$tree[substr($dir, $base_dir_length)] = filemtime($dir);
} elseif (is_dir($dir) && $di = dir($dir)) // add after is_dir condition to ignore CVS folders: && substr($dir, -4) != "/CVS"
{
if (!$root) $tree[substr($dir, $base_dir_length)] = false;  
while (($file = $di->read()) !== false)
if ($file != "." && $file != "..")
get_dir_tree("$dir/$file", false);  
$di->close();
}
if ($root)
return $tree;
}
?>


makarenkoa

A function that copies contents of source directory to destination directory and sets up file modes.
It may be handy to install the whole site on hosting.
<?php
// copydirr.inc.php
/*
26.07.2005
Author: Anton Makarenko
makarenkoa at ukrpost dot net
webmaster at eufimb dot edu dot ua
*/
function copydirr($fromDir,$toDir,$chmod=0757,$verbose=false)
/*
copies everything from directory $fromDir to directory $toDir
and sets up files mode $chmod
*/
{
//* Check for some errors
$errors=array();
$messages=array();
if (!is_writable($toDir))
$errors[]='target '.$toDir.' is not writable';
if (!is_dir($toDir))
$errors[]='target '.$toDir.' is not a directory';
if (!is_dir($fromDir))
$errors[]='source '.$fromDir.' is not a directory';
if (!empty($errors))
{
if ($verbose)
foreach($errors as $err)
echo '<strong>Error</strong>: '.$err.'<br />';
return false;
}
//*/
$exceptions=array('.','..');
//* Processing
$handle=opendir($fromDir);
while (false!==($item=readdir($handle)))
if (!in_array($item,$exceptions))
{
//* cleanup for trailing slashes in directories destinations
$from=str_replace('//','/',$fromDir.'/'.$item);
$to=str_replace('//','/',$toDir.'/'.$item);
//*/
if (is_file($from))
{
if (@copy($from,$to))
{
chmod($to,$chmod);
touch($to,filemtime($from)); // to track last modified time
$messages[]='File copied from '.$from.' to '.$to;
}
else
$errors[]='cannot copy file from '.$from.' to '.$to;
}
if (is_dir($from))
{
if (@mkdir($to))
{
chmod($to,$chmod);
$messages[]='Directory created: '.$to;
}
else
$errors[]='cannot create directory '.$to;
copydirr($from,$to,$chmod,$verbose);
}
}
closedir($handle);
//*/
//* Output
if ($verbose)
{
foreach($errors as $err)
echo '<strong>Error</strong>: '.$err.'<br />';
foreach($messages as $msg)
echo $msg.'<br />';
}
//*/
return true;
}
/* sample usage:
WARNING:
if You set wrong $chmod then You'll not be able to access files and directories
in destination directory.
For example: once upon a time I've called the function with parameters:
copydir($fromDir,$toDir,true);
What happened? I've forgotten one parameter (chmod)
What happened next? Those files and directories became inaccessible for me
(they had mode 0001), so I had to ask sysadmin to delete them from root account
Be careful :-)
<?php
require('./copydirr.inc.php');
copydirr('./testSRC','D:/srv/Apache2/htdocs/testDEST',0777,true);
?>
*/
?>


skyeye

<?php
// A function to copy files from one directory to another one, including subdirectories and
// nonexisting or newer files. Function returns number of files copied.
// This function is PHP implementation of Windows xcopy  A:\dir1\* B:\dir2 /D /E /F /H /R /Y
// Syntaxis: [$number =] dircopy($sourcedirectory, $destinationdirectory [, $verbose]);
// Example: $num = dircopy('A:\dir1', 'B:\dir2', 1);
function dircopy($srcdir, $dstdir, $verbose = false) {
 $num = 0;
 if(!is_dir($dstdir)) mkdir($dstdir);
 if($curdir = opendir($srcdir)) {
   while($file = readdir($curdir)) {
     if($file != '.' && $file != '..') {
       $srcfile = $srcdir . '\\' . $file;
       $dstfile = $dstdir . '\\' . $file;
       if(is_file($srcfile)) {
         if(is_file($dstfile)) $ow = filemtime($srcfile) - filemtime($dstfile); else $ow = 1;
         if($ow > 0) {
           if($verbose) echo "Copying '$srcfile' to '$dstfile'...";
           if(copy($srcfile, $dstfile)) {
             touch($dstfile, filemtime($srcfile)); $num++;
             if($verbose) echo "OK\n";
           }
           else echo "Error: File '$srcfile' could not be copied!\n";
         }                  
       }
       else if(is_dir($srcfile)) {
         $num += dircopy($srcfile, $dstfile, $verbose);
       }
     }
   }
   closedir($curdir);
 }
 return $num;
}
?>


Change Language


Follow Navioo On Twitter
basename
chgrp
chmod
chown
clearstatcache
copy
delete
dirname
disk_free_space
disk_total_space
diskfreespace
fclose
feof
fflush
fgetc
fgetcsv
fgets
fgetss
file_exists
file_get_contents
file_put_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
flock
fnmatch
fopen
fpassthru
fputcsv
fputs
fread
fscanf
fseek
fstat
ftell
ftruncate
fwrite
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
lchgrp
lchown
link
linkinfo
lstat
mkdir
move_uploaded_file
parse_ini_file
pathinfo
pclose
popen
readfile
readlink
realpath
rename
rewind
rmdir
set_file_buffer
stat
symlink
tempnam
tmpfile
touch
umask
unlink
eXTReMe Tracker