Автор Тема: Функция копирования папки в PHP  (Прочитано 8622 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн Белый Волк

  • 3 уровень
  • ***
  • Сообщений: 224
  • карма: +1/-0
    • Просмотр профиля
Функция копирования папки в PHP
« : 28 Сентября 2008, 23:19:06 »
Подскажите, пожалуйста, функцию PHP, которая поможет мне скопировать одну папку со всем содержимым в другую папку с заменой!
Спасибо!

ЗЫ. Функция copy не подойдет! Она только для файлов!

Оффлайн DARX

  • Global Moderator
  • 7 уровень
  • *****
  • Сообщений: 1559
  • карма: +23/-5
  • Knowledge is Power
    • Просмотр профиля
    • Web-программист
Re: Функция копирования папки в PHP
« Ответ #1 : 28 Сентября 2008, 23:35:41 »
Функция копирования директорий и поддиректорий:

function rec_copy ($from_path$to_path) { 
 
mkdir($to_path0777); 
 
$this_path getcwd(); 
 if (
is_dir($from_path)) { 
  
chdir($from_path); 
  
$handle=opendir('.'); 
  while ((
$file readdir($handle))!==false) { 
   if ((
$file != ".") && ($file != "..")) { 
    if (
is_dir($file)) { 
     
rec_copy ($from_path.$file."/"$to_path.$file."/"); 
     
chdir($from_path); 
    } 
    if (
is_file($file)) copy($from_path.$file$to_path.$file);
   } 
  } 
  
closedir($handle); 
 } 

Оффлайн Белый Волк

  • 3 уровень
  • ***
  • Сообщений: 224
  • карма: +1/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #2 : 03 Октября 2008, 14:11:46 »
to Darx

Большое спасибо за отклик!

Оффлайн DARX

  • Global Moderator
  • 7 уровень
  • *****
  • Сообщений: 1559
  • карма: +23/-5
  • Knowledge is Power
    • Просмотр профиля
    • Web-программист
Re: Функция копирования папки в PHP
« Ответ #3 : 06 Октября 2008, 23:11:32 »
to Darx

Большое спасибо за отклик!
Всегда пожалуйста

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #4 : 18 Ноября 2008, 20:49:41 »
как бы ничего что не пашет нифига? :) напутали там со скобочками...

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #5 : 18 Ноября 2008, 20:54:35 »
по теме кстати:
требуется скопировать с компьютера по локальной сети - усе функции встреченные на просторах интернета почемуто не копируют заразы :) расчитаны как я понал на копирование либо внутри компьютера, либо с хттп - а вот по локальной сетке не предусмотренно.
норм работающая функция, со всеми, находящимися на месте, скобочками, внутри компьютера, из папки в папку для товарища Белого Волка:

function copyr($source, $dest)
{
    // Simple copy for a file
    if (is_file($source)) {
        return copy($source, $dest);
    }
 
    // Make destination directory
    if (!is_dir($dest)) {
        mkdir($dest);
    }
   
    // If the source is a symlink
    if (is_link($source)) {
        $link_dest = readlink($source);
        return symlink($link_dest, $dest);
    }
 
    // Loop through the folder
    $dir = dir($source);
    while (false !== $entry = $dir->read()) {
        // Skip pointers
        if ($entry == '.' || $entry == '..') {
            continue;
        }
 
        // Deep copy directories
        if ($dest !== "$source/$entry") {
            copyr("$source/$entry", "$dest/$entry");
        }
    }
 
    // Clean up
    $dir->close();
    return true;
}

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: Функция копирования папки в PHP
« Ответ #6 : 19 Ноября 2008, 10:00:09 »
не совсем понял что подразумевается под
требуется скопировать с компьютера по локальной сети
Как я понял это такая же функция, что и привел Darx, несколько видоизмененная, с "заплатками".
Что касается скобочек - ну у кого не бывает, главное суть.

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #7 : 20 Ноября 2008, 13:44:56 »
суть вопроса в чем - представленная функция нормально работает, в случае если надо скопировать папку внутри компьютера, где установлен PHP. к примеру с С: на D:. в случае если вы планируете скопировать с компьютера в локальной сети - функция не работает :) как впрочем и её аналоги, встречавшиеся в интернете. к примеру "\\\\komp\\test" на "D:\\backup" - ругается :) думал дело в слешах, но если вместо локального компьютера вписать имя этогоже компьютера, где пхп и работает все нормально "\\\\kompcphp\\test" - то есть слеши ни причем :)
догадался проверить функцию и с монтированием сетевого диска, тогда адрес меняется на "Z:\\test" к примеру, тоже самое :) думал дело в файерволе - отключен, в антивирусе - снес нафиг. ну не копируется оно и все тут :))
даже предусмотрел если папка для копирования весит 200-300 мегабайт, то в самом пхп нужно было поставить время выполнения скрипта побольше, чем 30 секунд, а 900 к примеру. может кто сталкивался? :) может какуюлибо службу отрубить надо на обоих компах? или наоборот включить? :) или сам пхп что-нибуть доконфигурировать? она меня закалибала :) на англиском висело какоето предупреждение на эту тему, только с англиским не особо. сейчас попробую найти.

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

вот видимо моя проблема, только у меня Permission denied не возникает. кто в англиском шарит - чо тот парень пишет то? :))
ссылка на это предупреждение: http://www.php.net/manual/ru/function.copy.php#45357
кстати там же и милион вариантов копирования папки.

Оффлайн Fiyanov

  • 2 уровень
  • **
  • Сообщений: 57
  • карма: +2/-4
  • За красивой жизнью в погоне...
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #8 : 09 Декабря 2008, 10:50:33 »
Цитировать
needs to contain the actual file name
Необходимо правильное имя

Цитировать
NOT just the path to the folder you wish to copy into
Не только папки куда копируете

Видимо имееться ввиду что то типа: Из "C:\foldername\filename.dat" в "D:\foldername\filename.dat"

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #9 : 10 Декабря 2008, 02:35:12 »
да ет то ясно. просто та функция внутри компьютера с пхп копирует нормально, если с:\темп в с:\темп2 - фсе замечательно.
а вот если по сети \\komp2\test в с:\темп2 - фиг тама. как то ему сетевые имена компьютеров не нравяца. пробывал и айпи \\192.168.1.3\test - нифига.
хотя если же писать имя этого же компьютера с установленным пхп и расшареной папкой темп, но как бы по сети \\этотжекомпьютер\темп в с:\темп2 - все замечательно копирует.
пробывал и монтирование сетевых дискоф - тоже самое. файерволы все посносил, антивирусы тоже. незнаю в чем дело.

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #10 : 10 Декабря 2008, 02:37:57 »
видимо дело в слешах, если их не экранировать - фигня выходит - он путь не пральный показывает. а если экранировать, то путь вроди норм, но что-то парится.
то есть \\\\этотжекомпьютер\\темп вот так путь надо указывать.

Оффлайн Fiyanov

  • 2 уровень
  • **
  • Сообщений: 57
  • карма: +2/-4
  • За красивой жизнью в погоне...
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #11 : 10 Декабря 2008, 16:16:35 »
Цитировать
но что-то парится
Каким макаром?

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #12 : 10 Декабря 2008, 20:50:28 »
обычно на $dir = dir($source); точный текст уже не помню. а в офисе редко бываю. локалки дома нет.
пишет что-то функция dir бла бла бла :) привезу завтра вечером точный текст ошибки.

Оффлайн SeregaZ

  • Новичок
  • *
  • Сообщений: 12
  • карма: +0/-0
    • Просмотр профиля
Re: Функция копирования папки в PHP
« Ответ #13 : 11 Декабря 2008, 21:07:04 »
<?php
function copyr($source, $dest)
{
    // Simple copy for a file
    if (is_file($source)) {
        return copy($source, $dest);
    }
 
    // Make destination directory
    if (!is_dir($dest)) {
        mkdir($dest);
    }
   
    // If the source is a symlink
    if (is_link($source)) {
        $link_dest = readlink($source);
        return symlink($link_dest, $dest);
    }
 
    // Loop through the folder
    $dir = dir($source);
    while (false !== $entry = $dir->read()) {
        // Skip pointers
        if ($entry == '.' || $entry == '..') {
            continue;
        }
 
        // Deep copy directories
        if ($dest !== "$source/$entry") {
            copyr("$source/$entry", "$dest/$entry");
        }
    }
 
    // Clean up
    $dir->close();
    return true;
}

copyr ("\\\\Komp\\kopirovat", "D:\\backup");
?>

текст ошибок:
Warning: dir(\\Komp\kopirovat) [function.dir]: failed to open dir: Invalid argument in D:\Program\EasyPHP\www\back.php on line 21

Fatal error: Call to a member function read() on a non-object in D:\Program\EasyPHP\www\back.php on line 22

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: Функция копирования папки в PHP
« Ответ #14 : 12 Декабря 2008, 09:14:31 »
А что передаешь в качестве аргумента $source? Судя по ругани, в нем касяк.