[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема при копировнии файлов с помощью PHP
Leximus
Приветстую!

Есть некоторая функция


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;
}


При копировании папки с большим количеством файлов, копирует только 19998 файлов.

Что с функцией не так? Как можно обойти?



Спустя 15 минут, 55 секунд (17.09.2011 - 04:17) Invis1ble написал(а):
Каков максимальный уровень вложенности?

Спустя 1 час, 25 минут, 4 секунды (17.09.2011 - 05:42) Leximus написал(а):
Цитата (Invis1ble @ 17.09.2011 - 01:17)
Каков максимальный уровень вложенности?

В папке может быть и 39 тысяч файлов, но вроде не больше. А вот вложенных папок в копируемых папках нету.

Спустя 12 минут (17.09.2011 - 05:54) Игорь_Vasinsky написал(а):
Ай-ай ай

        // Deep copy directories
if ($dest !== "$source/$entry") {
copyr("$source/$entry", "$dest/$entry");
}


как-то не по христиански :D

Спустя 37 минут, 11 секунд (17.09.2011 - 06:31) Invis1ble написал(а):
Leximus
Тогда странно... Ошибки выдает какие-то? Может лимит памяти исчерпывается?
А если взять другую папку с большим количеством других файлов, тоже останавливается на 19998-ом или другая цифра?

Спустя 5 минут, 7 секунд (17.09.2011 - 06:36) inpost написал(а):
Leximus
На *unix системах лимит файлов в одной папке, равна 20`000.
Именно поэтому не копируется больше. Разбивай на папки.

Спустя 12 минут, 34 секунды (17.09.2011 - 06:49) Invis1ble написал(а):
Цитата
На *unix системах лимит файлов в одной папке, равна 20`000

насколько я понимаю, это ограничение ФС, а не ОС

Спустя 10 минут, 31 секунда (17.09.2011 - 06:59) inpost написал(а):
Invis1ble
Кирик говорил про *unix, но в связи с отсутствием опыта в этом вопросе могу ошибаться с четкой формулировкой, в чём именно особенность. Я знаю лишь, что ограничение идет в 20к на конкретную папку.

Спустя 10 минут, 18 секунд (17.09.2011 - 07:10) inpost написал(а):
http://phpforum.ru/index.php?showtopic=18620
Вот ещё темка есть, там про 32 000 говорится для ФС как раз.

Спустя 1 час, 45 минут, 59 секунд (17.09.2011 - 08:56) Leximus написал(а):
В нескольких папках файлов по количеству более 30 тысяч. Копирую каждую папку отдельно. Вот тут то каждая папка копируется только по 19998 файлов. Никаких ошибок не выдаёт. Копирую через запуск скрипта. Так как у меня доступ только к части ФТП к остальной части где лежит папка со всеми файлами нету, по этой причине копирую туда от куда через ФТП могу забрать.

Может через PHP как то можно запокавать файлы, или например если количество файлов перевалило за 10 тысяч копировать в подпапку? - Как кстати вариант попробывать. Вот только не знаю как правильно модернизировать скрипт, так как только начал работать с ним.

Спустя 13 минут, 24 секунды (17.09.2011 - 09:09) Invis1ble написал(а):
Цитата
Может через PHP как то можно запокавать файлы, или например если количество файлов перевалило за 10 тысяч копировать в подпапку?

ну да, как вариант - архивировать по достижении некоторой критической отметки количества файлов. Есть класс ZipArchive, с помощью него можно вроде как. Ну или перемещать в отдельную директорию. Смотри сам, как тебе оптимальней.

Спустя 1 день, 6 часов, 52 минуты (18.09.2011 - 16:01) Leximus написал(а):
А может это быть ограничение не на количество файлов, а на список, ну в который попоадает список файлов. Ведь например строка содержащая 10 символов не может хранить 11 символов. Ну здесь может в строке именно ограничения, по 2000 строк. Ведь файлов то 19998, а . и .. этоже не файлы. Но в любом случае сейчас буду проверять!

Спустя 16 часов, 23 минуты, 58 секунд (19.09.2011 - 08:25) linker написал(а):
Строки в PHP не имеют ограничения по длине. Вообще странный код
$dir = dir($source);
while (false !== $entry = $dir->read()) {
Что есть dir(), что есть $dir->read()? И вообще под каждый файл делать вызов функции copyr() некрасиво, рекурсию нужно делать только для папок, а копировать файлы внутри цикла, а не до.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.