Подсчет файлов вложенных папок,вес+новые
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)
С поиском сам не дружу=((
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)
Выкладывай коль не жалко
34.
Артур (22.03.2010 / 03:47)
http://upwap.ru/797455
35.
Артур (22.03.2010 / 03:48)
Забыл сменитьрасширение класса :[ там оно .h (привычка C++совца
), но и с ним PHP вроде ладит
36.
Артур (22.03.2010 / 03:50)
Там нет непосредственного подсчета суммарного размера, но имея массив всех файлов каталога, думаю будет не сложно дописать подобную функцию ;)
Класс можно улучшить на мой взгляд, так что сильно не бейте )
37.
ramzes (22.03.2010 / 03:56)
Надо посмотреть
// когда инклудишь файл в пхп страницу, расширение этого файла ни какой роли не играет
хоть .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)
Прочитал что вам поиск нужен
Можно использовать и метод моего класса 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)
Подожди
Я пробовал на Денвере, искал файл и папку, вроде работает без помарок
Удачи
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