Подсчет файлов вложенных папок,вес+новые

1. ★☆ ИгRok™ ☆★ (19.03.2010 / 11:53)
Всем привет,ребят,как осуществить подсчет файлов в подпапках например в папке dоwn,лежит еще 6-7 папок,как подсчитать в них файлы? Например эта функция:
function read_dir($dir) {
if (empty($allsize)){$allsize = 0;}
if ($path = opendir($dir)) {
while ($file_name = readdir($path)) {
if (($file_name!=='.') && ($file_name!=='..')){
if (is_dir($dir."/".$file_name)) {$allsize +=read_dir($dir."/".$file_name);} else { $allsize += filesize($dir."/".$file_name);}
}}
closedir ($path);
}
return $allsize;
}
выводит колличество папок,или файла в одной директории...а надо с подпапками,и вес такого же формата,чтоб показывал вес папки и папок вложенных в нее,по такому принципу,и последнее,как на файлах все сделать,что бы показывало новые файлы,например 312/+91?

2. ★☆ ИгRok™ ☆★ (19.03.2010 / 12:07)
Ошибочка,код выше,выводит вес,но очень подозрительным числом

3. Lugaro (19.03.2010 / 12:16)
2. InFeRoruM AngeluS, че подозрительным? гг
Она выводит тебе вес в байтах, раздели на 1024 и получишь в кб

4. ★☆ ИгRok™ ☆★ (19.03.2010 / 12:30)
3.каким образом? Если путь типо есhо rеаd_dir('путь к папке');

5. Игорь (19.03.2010 / 12:45)
В моторе есть вот такая функция, попробуй:
 <?php
function formatsize($file_size){
if ($file_size >= 1048576000){
$file_size = round(($file_size / 1073741824), 2) . " Gb";
} elseif (
$file_size >= 1024000){
$file_size = round(($file_size / 1048576), 2) . " Mb";
} elseif (
$file_size >= 1000){
$file_size = round(($file_size / 1024), 2) . " Kb";
} else {
$file_size = round($file_size) . " byte";}
return $file_size;}
echo formatsize(rеаd_dir('путь к папке'));

6. ★☆ ИгRok™ ☆★ (19.03.2010 / 12:48)
5.спасибо,попробую

7. Lugaro (19.03.2010 / 13:31)
InFeRoruM AngeluS (Сегодня / 12:30)
3.каким образом? Если путь типо есhо rеаd_dir('путь к папке');
есhо rеаd_dir('путь к папке')/1024.'кб';

8. ★☆ ИгRok™ ☆★ (19.03.2010 / 13:34)
7.Блин,я сам себя поражаю,я это так и делал,спасибо!
С одним разобрались,как другое?

9. Azzido (19.03.2010 / 14:44)
просто когда ты считаешь количество или размер файлов в папке нужно поставить условие что если рассматриваемый объект - папка а не файл то функция вызывает сама себя это называется рекурсивная функция

10. ★☆ ИгRok™ ☆★ (19.03.2010 / 23:06)
Ни один из способов не работает

11. Игорь (19.03.2010 / 23:57)
Вот смотри есть две функции, не знаю может помогут если под себя заточишь:
 <?php
  //////////////////////////////////////////////////////////
  // Рекурсивная функция - спускаемся вниз по каталогу
  //////////////////////////////////////////////////////////
  function scan_dir($dirname)
  {
    // Открываем текущий каталог
    $dir = opendir($dirname);
    // Читаем в цикле каталог
    while (($file = readdir($dir)) !== false)
    {
      // Проверяем, не равно ли значение переменной
      // $file текущему или вышележащему каталогу
      if($file != "." && $file != "..")
      {
        // Если перед нами каталог, вызываем рекурсивно
        // функцию scan_dir
        if(is_dir($dirname."/".$file))
        {
          echo $dirname."/".$file." - ".
               file_count($dirname."/".$file)."<br>";
          scan_dir($dirname."/".$file);
       }
     }
   }
   // Закрываем каталог
   closedir($dir);
  }
  //////////////////////////////////////////////////////////
  // Функция, вычисляющая число файлов в каталоге
  //////////////////////////////////////////////////////////
  function file_count($dirname)
  {
    // Переменная для подсчета
    $count = 0;
    // Открываем каталог
    $dir = opendir($dirname);
    // В цикле считываем его содержимое
    while(($file = readdir($dir)) !== false)
    {
      // Если текущий объект является файлом, считаем его
      if(is_file($dirname."/".$file)) ++$count;
    }
    // Закрываем каталог
    closedir($dir);
    return $count;
  }
  // Имя каталога
  $dirname = ".";
  // Вызов функции, осуществляющей рекурсивный спуск по подкаталогам
  // корневого каталога
  scan_dir($dirname);


12. ★☆ ИгRok™ ☆★ (20.03.2010 / 08:15)
11.спасибо,попробую

13. ★☆ ИгRok™ ☆★ (20.03.2010 / 08:33)
Ну нет,хе,она все папки расписала

14. ★☆ ИгRok™ ☆★ (20.03.2010 / 21:30)
Может кто-нибудь поможет с кодом +новые файлы?

15. Удаленный (20.03.2010 / 23:26)
<?
function count_dir($dir)
{
$count=0;
if($dirs=opendir($dir))
{
while($buf=readdir($dirs))
{
if(($buf!=='.') && ($buf!==".."))
{
if(is_dir($dir."/".$buf))
{
$count+=count_dir($dir.'/'.$buf);
}
else
{
$count++;
}
}
}
}
closedir($dirs);
return $size;
}
echo count_dir('./downloads');//Вконце без слеша
?>
Сейчас напишу для поиска новых

16. ★☆ ИгRok™ ☆★ (20.03.2010 / 23:29)
15.спасибо! Следующий код жду =) с меня плюс

17. Удаленный (20.03.2010 / 23:40)
Ето подщет всех файл даже в подпапках

18. Удаленный (20.03.2010 / 23:58)
В верхней функцие там return $size; надо за
енить на return $count;
Подщет новых файлов
<?
function count_dir($dir,$times=86400,$time=0)
{
if(empty($time)) $time=time();
$time-=$times;
$count=0;
if($dirs=opendir($dir))
{
while($buf=readdir($dirs))
{
if(($buf!=='.') && ($buf!==".."))
{
if(is_dir($dir."/".$buf))
{
$count+=count_dir($dir.'/'.$buf);
}
else
{
if(filemtime($dir.'/'.$buf)>$time) $count++;
}
}
}
}
closedir($dirs);
return $count;
}
?>
Потом вызываем
<?
echo count_dir("Папка");
//Результат количество файлов за сутки
Если надо указать за неделлю
<?
echo count_dir("Папка",(86400*7));
//Результат количество файлов за неделлю


19. ★☆ ИгRok™ ☆★ (21.03.2010 / 01:20)
18.спасибо,плюс поставил

20. Удаленный (21.03.2010 / 01:33)
Обращайся

21. ★☆ ИгRok™ ☆★ (21.03.2010 / 01:43)
20.а может ты подскажешь поиск файлов и вес в кб? =) вес написал,но он в байтах =(

22. ★☆ ИгRok™ ☆★ (21.03.2010 / 01:50)
А ты правильно написал эти коды? Я скопировал,вставил как есть! Выдает ошибку:
Fatal error: Cannot redeclare count_dir() (previously diclared

23. ★☆ ИгRok™ ☆★ (21.03.2010 / 11:14)
Все,сам исправил,работает все

24. Игорь (21.03.2010 / 11:51)
21, я эту функцию писал чуть выше
 <?php
function formatsize($file_size){ 
if ($file_size >= 1048576000){ 
$file_size = round(($file_size / 1073741824), 2) . " Gb"; 
} elseif ( 
$file_size >= 1024000){ 
$file_size = round(($file_size / 1048576), 2) . " Mb"; 
} elseif ( 
$file_size >= 1000){ 
$file_size = round(($file_size / 1024), 2) . " Kb"; 
} else { 
$file_size = round($file_size) . " byte";} 
return $file_size;}
А насчет 11 я написал "не знаю может помогут если под себя заточишь"=))

25. ★☆ ИгRok™ ☆★ (21.03.2010 / 11:57)
24.эта не работает,а в 11 у меня глаза на лог вылезли,когда все подпапки и папки вылезли наружу...да я уже все сделал,все работает,все считает=)осталось разобраться с поиском=(

26. Игорь (21.03.2010 / 11:58)
25. InFeRoruM AngeluS, молодчик=) ЗЫ та функция работает на 5+ =)
А поиск всмысле? Что должна искать?

27. ★☆ ИгRok™ ☆★ (21.03.2010 / 11:59)
26.ну может я че не так сделал,а поиск,обычный,поиск файлов,например по названию там! Ну и так далее =)

28. Игорь (21.03.2010 / 12:02)
С поиском сам не дружу=(( D

29. ★☆ ИгRok™ ☆★ (21.03.2010 / 12:05)
28.во во,я о том же,ну может кто нибудь из ребят напишет,и тебе и мне урок =)))

30. Игорь (21.03.2010 / 12:09)
29. InFeRoruM AngeluS, Согласен =)

31. ramzes (22.03.2010 / 02:57)
<?php
$dir = opendir('load');
while( $file = readdir($dir) ){
if(stripos($file,$query)){
$result[] = $file;
}}
closedir($dir);
print_r($result);
незнаю что там у тебя и как. Так от балды. Поиск по названию файла папке.
Исполнение кака. База данных - рулед.

32. Артур (22.03.2010 / 03:24)
Прочел только первый пост, если его вопрос еще актуален, могу выложить один мой очень хороший класс (точнее их там два, но считаю за один), он как раз для работы с файлами (писал для работы с xml базой данных), рекурсивно создает древо объектов типа File и Dir.
Надо?

33. ramzes (22.03.2010 / 03:34)
Выкладывай коль не жалкоsmile

34. Артур (22.03.2010 / 03:47)
http://upwap.ru/797455

35. Артур (22.03.2010 / 03:48)
Забыл сменитьрасширение класса :[ там оно .h (привычка C++совца D ), но и с ним PHP вроде ладит

36. Артур (22.03.2010 / 03:50)
Там нет непосредственного подсчета суммарного размера, но имея массив всех файлов каталога, думаю будет не сложно дописать подобную функцию ;)
Класс можно улучшить на мой взгляд, так что сильно не бейте )

37. ramzes (22.03.2010 / 03:56)
Надо посмотретьsmile
// когда инклудишь файл в пхп страницу, расширение этого файла ни какой роли не играетsmile хоть .h хоть .zhopa))

38. Артур (22.03.2010 / 04:14)
А ну тогда отлично )
Кстати, несколько минусов класса отмечу:
1) Огромная ресурсоемкость (на себе испытал), так как при построении полной иерархии объектов прочитываются все файлы (даже пустые и возможно не нужные для данной задачи)
Обойти можно приблежением корневой папки к используемым файлам, а именно:
Если структура такая d - папка; f - файл
d1[ d2( d5(f1,f2) d6(f3,f4) ) d3( d7(f5,f6) ) d4( d9(f7,f8) d10(f9,f10) ) ]
и требуется получить доступ к файлам f1,f2,f3,f4,f5,f6 то лучше создать два объекта для d2 и d3 чем один для d1, убережетесь от накопления ненужных файлов ;)
Другими словами максимально приблежайте корневую папку к искомым файлам

39. Артур (22.03.2010 / 04:15)
2) Отсутствие фильтров - не успел написать фильтры на тип файлов, на пример чтоб не задевало файлы определенных типов, или наоборот, чтоб искало только файлы, типов заданных в аргументе, на пример все файлы типа txt и xml

40. Артур (22.03.2010 / 04:19)
3) Отсутствие контроля вложенности - точнее только два варианта, единичная вложеность и полная вложеность, а вдруг мне надо иерархию до 4 вложености получить? Но это не сложно поправить

41. Артур (22.03.2010 / 04:27)
Прочитал что вам поиск нужен smile
Можно использовать и метод моего класса getDate с полной вложенностью и передачей в нее дополнительного аргумента: Имя Искомого Файла
А в теле просто проверять в соответствующем месте совпадает ли имя или нет с заданым, если совпало, записываем адрес файла в новый массив

42. ★☆ ИгRok™ ☆★ (22.03.2010 / 08:09)
41.если можешь,напиши код,как знаешь...уже задолбался голову морочить,смотрел в других зц,но все на базе,а с базой я не работаю...если можешь,напиши код...

43. Артур (22.03.2010 / 11:08)
Bashka (Сегодня / 02:50)
Там нет непосредственного подсчета суммарного размера, но имея массив всех файлов каталога, думаю будет не сложно дописать подобную функцию ;)
Класс можно улучшить на мой взгляд, так что сильно не бейте )
Тебя нужно сильно бить, ибо велосипед одноколёсный напесал ыЫ

44. ★☆ ИгRok™ ☆★ (22.03.2010 / 13:20)
ramzes (Сегодня / 02:57)
<?php
$dir = opendir('load');
while( $file = readdir($dir) ){
if(stripos($file,$query)){
$result[] = $file;
}}
closedir($dir);
print_r($result);
незнаю что там у тебя и как. Так от балды. Поиск по названию файла папке.
Исполнение кака. База данных - рулед.
спасибо,вот только как связать его с формой поиска? <form action="file.php" method="post">?

45. Удаленный (26.03.2010 / 00:36)
Шас катну тибе функцию

46. Удаленный (26.03.2010 / 02:01)
<?
<?
function open_dir($dir)
{  
if($dirs=opendir($dir))
{ while($buf=readdir($dirs))
{ if(($buf!=='.') && ($buf!==".."))
{ if(is_dir($dir."/".$buf))
{ $file.=open_dir($dir.'/'.$buf);
} else
{
$file.='|:|'.$dir.'/'.$buf.'|:|'.filemtime($dir.'/'.$buf).'|:|'.filesize($dir.'/'.$buf).'|:|:||:';
} } } } closedir($dirs);
return $file;
}


47. Удаленный (26.03.2010 / 02:10)
<?
//Получаем в переменную массив всех файлов с папки
$array_f=explode(':||:',open_dir('.'));
//И перебераем
$filesize[0]=1024; //вес от
$filesize[1]=10240; //вес до
$filemtime=time()-84600; //Время файла
$i=0;
while($array_f[$i])
{
$bufer=explode('|:|',$array_f[$i]);
//array(1=>'Путь', 2=>'Время', 3=>'Размер')
if($filesize[0]>=$bufer[3] && $bufer[3]<=$filesize[1] && $filemtime<=$bufer[2])
{
$file[]=$array_f[$i];
}
unset($bufer);
++$i;
}
print_r($file);
Дальше разбирешся нащет поисков времени уже нету. У воскресенье буду на связе.

48. ★☆ ИгRok™ ☆★ (26.03.2010 / 07:00)
47. TLENSi, спасибо большое,в воскресенье жду ,плюс уже ставил =)

49. Артур (26.03.2010 / 11:39)
Поиск на основе моего класса http://upwap.ru/803802
Работает вроде, проверил несколько раз
Используется метод find корневой папки, поиск рекурсивно по всему древу файлов и папок, возвращает одномерный массив файлов типа File найденных в корневой папке
В архиве класс и пример работы
Папки тоже ищет, проверил

50. Артур (26.03.2010 / 11:47)
Извиняюсь что так долго, не заметил темы

51. ★☆ ИгRok™ ☆★ (26.03.2010 / 11:54)
49.спасибо,попробуем,но все равно еще подожду до воскресенья =)

52. Артур (26.03.2010 / 11:55)
Подожди smile
Я пробовал на Денвере, искал файл и папку, вроде работает без помарок
Удачи

53. ★☆ ИгRok™ ☆★ (26.03.2010 / 11:56)
46 и 47.только я не очень понял куда это,попробую еще раз потестить

54. ★☆ ИгRok™ ☆★ (26.03.2010 / 11:57)
52.да попробую,разберемся если что=)

55. Удаленный (26.03.2010 / 13:13)
46 киидаеш у файл с функциями и инклюдиш в нужный скрипт.
И в скрипте вызываеш ету функцию
<?
$f=open_dir('dowloads');
/*
Одна точка текушая папка
Две предыдушая
В переменной будет список типо 
|:|dowloads/anime/1.gif|:|Время файла|:|Размер в байтах|:|:||:|:|dowloads/sound/1.mp3|:|Время файла|:|Размер в байтах|:|:||:
*///Розбиваем на массив
$f=explode(':||:',$f);
/*
Типерь массив содержит 
$f=array(0=>"|:|dowloads/anime/1.gif|:|Время файла|:|Размер в байтах|:|",
1=>"|:|dowloads/sound/1.mp3|:|Время файла|:|Размер в байтах|:|");
*///И обрабатуем циклом 
через пол часа буду выежать но ютел работает в роумиге с Киевстаром Думаю сеть будет.

56. ★☆ ИгRok™ ☆★ (27.03.2010 / 14:19)
55. TLENSi, все равно не очень понял,понял,но вот в чем беда,я хочу сделать например,вывод веса файла,ну и другую информацию,например,как ты написал,хочу вывести под файлом сразу или справа,одним словом,хотел как на 7bа.ru...ну и за это спасибо,буду разбираться,просто,почему не понятно? Просто смешивать свои коды с другими,трудновато,но спасибо,попробую,если что и твой варианта поиска жду=)

URL: https://visavi.net/topics/7136