Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получение списка имён файлов в папке?
 
 автор: TuX   (11.06.2005 в 15:35)   письмо автору
 
 

С получением списка имен файлов проблем нет, но если в папке есть помимо файлов ещё папка, то в массив загоняются и имена этих папок. Можно ли как-то исключить имена папок? Список имен файлов в папке я получаю так:

<?
$ndirct 
"news/baza";
$nhdl=opendir($ndirct);
while (
$nfile readdir($nhdl))
{
if ((
$nfile!=".")&&($nfile!=".."))
        {
                
$na[] = $nfile;
        }
}
closedir($nhdl);
if (
sizeof($na)!=0)
{
rsort($na);
$vsego=sizeof($na);
}
else
{
        echo (
"Нет новостей в базе<br><br><a href=news/add_news_form.php>Добавить новость?</a>");
        die;
}
?>

   
 
 автор: isset   (11.06.2005 в 15:48)   письмо автору
 
   для: TuX   (11.06.2005 в 15:35)
 

Можно использовать функцию is_file, которая проверяет является ли filename файлом.

<?
$ndirct 
"news/baza";
$nhdl=opendir($ndirct);
while (
$nfile readdir($nhdl))
{
if ((
$nfile!=".")&&($nfile!="..") && is_file($nfile))
        {
                
$na[] = $nfile;
        }
}
closedir($nhdl);
if (
sizeof($na)!=0)
{
rsort($na);
$vsego=sizeof($na);
}
else
{
        echo (
"Нет новостей в базе<br><br><a href=news/add_news_form.php>Добавить новость?</a>");
        die;
}
?> 


Кстати, можно упростить провреку:


<?
$ndirct 
"news/baza";
$nhdl=opendir($ndirct);
while (
$nfile readdir($nhdl))
{
if (
is_file($nfile))
        {
                
$na[] = $nfile;
        }
}
closedir($nhdl);
if (
sizeof($na)!=0)
{
rsort($na);
$vsego=sizeof($na);
}
else
{
        echo (
"Нет новостей в базе<br><br><a href=news/add_news_form.php>Добавить новость?</a>");
        die;
}
?> 

   
 
 автор: TuX   (11.06.2005 в 16:03)   письмо автору
 
   для: isset   (11.06.2005 в 15:48)
 

Почему-то при выполнении Ваших скриптов выполняется только условие else. Скрипт говорит, что "Нет новостей в базе":(

   
 
 автор: isset   (11.06.2005 в 16:09)   письмо автору
 
   для: TuX   (11.06.2005 в 16:03)
 

Только что проверил, все работает. Возможно в папке нет файлов..

   
 
 автор: TuX   (11.06.2005 в 16:13)   письмо автору
 
   для: isset   (11.06.2005 в 16:09)
 

Всё на месте, мой скрит работает, а Ваш почему-то нет :(

   
 
 автор: Akira   (11.06.2005 в 16:22)   письмо автору
 
   для: TuX   (11.06.2005 в 16:13)
 


 <?
 $mask 
"*.txt"# Выводит все txt файлы, txt можно заменить на любое расширение, файлы которые вы ищите задаються маской в виде имя.расширение (все файлы *.*)
foreach (glob($mask ) as $filename) {
   echo 
$filename.'<br>';
}
  
?>

   
 
 автор: Akira   (11.06.2005 в 16:25)   письмо автору
 
   для: Akira   (11.06.2005 в 16:22)
 

У меня есть скрипт более массивный чем этот. Это усовершенствонная версия. Но если он не будет работать или по каким то другим причинам, могу выложить старую версию.

   
 
 автор: TuX   (11.06.2005 в 16:32)   письмо автору
 
   для: Akira   (11.06.2005 в 16:25)
 


Warning: Invalid argument supplied for foreach() in E:\server\www\www.samoreg.ru\news\index2.php on line 3

   
 
 автор: TuX   (11.06.2005 в 16:41)   письмо автору
 
   для: Akira   (11.06.2005 в 16:22)
 

А как можно применить данный скрипт? Что то я не очень понял.
1. Задаем переменную $mask и говорим, что она равна *.txt
2. Делаем преребор для каждого ????
3. Выводим Имя файла на страницу

Можно объяснисть вот эту конструкцию по-этапно?

foreach (glob($mask ) as $filename)

   
 
 автор: Akira   (11.06.2005 в 19:22)   письмо автору
 
   для: TuX   (11.06.2005 в 16:41)
 

<? 
$mask 
"*.txt"# Задаем маску поиска
foreach (
glob($mask ) as $filename # glob возврашает массив, а foreach ободит его.


   echo 
$filename.'<br>'

  
?>

В $mask задаем путь и тип файлов. Для поиска в папке news всех inc файлов маска будет такая "/news/*.inc".
Если возникает ошибка, то значит сервер не поддерживает glob.
Попробуйте так.

<? 
$mask 
"*.txt"# Задаем маску поиска
print_r (glob($mask ) )
?>

   
 
 автор: PHPFan   (15.06.2005 в 15:42)   письмо автору
 
   для: isset   (11.06.2005 в 15:48)
 

Всё очень замечательно работает, но только при чтении своих же папок.
Мне очень нужно прочитать папку _http://imyahosta.net/papka, которая находится извне, относительно моего сайта. Как это можно реализовать? есть ли методы подхода к решению подобной задачи?

p.s. в удалённой папке индексного файла нет, при заходе с браузера выводится обычный список файлов (сервер Apache).

   
 
 автор: cheops   (15.06.2005 в 20:50)   письмо автору
 
   для: PHPFan   (15.06.2005 в 15:42)
 

Можно загрузить спискок файлов в виде HTML-файл, разобрать его, например, при помощи регулярных выражений... к сожалению, указанный вами адрес не отвечает, если вам не сложно прикрепите к сообщению HTML-файл со списком файлов, чтобы можно было на его примере привести рабочий скрипт.

   
 
 автор: PHPFan   (15.06.2005 в 21:04)   письмо автору
 
   для: cheops   (15.06.2005 в 20:50)
 

Файл представляет собой обычный список, который по-умолчанию формирует Apache. Пример в аттаче.

   
 
 автор: cheops   (16.06.2005 в 12:25)   письмо автору
 
   для: PHPFan   (15.06.2005 в 21:04)
 

Можно поступить следующим образом
<?php
  $text 
file_get_contents("http://imyahosta.net/papka/");
  
preg_match_all("|<a[\s]+href=\"([^\"]+)\">([^<]+)<|i",
                 
$text,
                 
$out,
                 
PREG_PATTERN_ORDER);
  for(
$i 0$i count($out[1]); $i++)
  {
    if(
$out[1][$i] == $out[2][$i]) echo $out[1][$i]."<br>";
  }
?>

   
 
 автор: PHPFan   (17.06.2005 в 04:27)   письмо автору
 
   для: cheops   (16.06.2005 в 12:25)
 

Огромадное спасибо! Это действительно работает! Причём очень хорошо. Протестил при самых различных именах файлов - ни единого сбоя :)
cheops просто нет слов. Вы классный специалист.
извините за оффтоп...

   
 
 автор: cheops   (11.06.2005 в 20:55)   письмо автору
 
   для: TuX   (11.06.2005 в 15:35)
 

Для этого можно добавить проверку при помощи функции is_file(), которая возвращет true если в качестве аргумента передано имя файла и false в противном случае
<?php
  
if(is_file($nfile))
  {
    
// ...
  
}
?>

   
 
 автор: Akira   (11.06.2005 в 21:13)   письмо автору
 
   для: cheops   (11.06.2005 в 20:55)
 

Сложный вариант =)

 <?
 $dirname 
'.'# Данный Каталог (Указываем любой)
 
$dir opendir($dirname); # Открываем каталог
    
while ($file readdir($dir))
    {
        
$size bcdiv(@filesize($file), 1024 2); /* чисто символьный размер в кб */
        
$size_full round($size).'(кб.)'/* размер файла с указанием в чем измеряем */
        
$filename substr($file,0,strpos($file,".")); /* имя файла без расширения */
        
$exe strrchr($file'.'); /* его расширение */
    
if(($file != "."# Каталог Данный
    
&&($file != ".."# Каталог Корневой
    
&& (substr($file, -3) != "php"/* Файлы с расшерением .php не выводяться, можно указать любой тип файлов который не надо выводить, пример: && (substr($file, -3) != "html") */
    
&&(is_file($file)) # Не выводим каталоги
    
)
        { 
        
        print 
$file.'<br>';
    }
  }
  
  
closedir($dir); # Закрываем каталог
  
?>

А делает то же =))

   
 
 автор: isset   (11.06.2005 в 21:19)   письмо автору
 
   для: Akira   (11.06.2005 в 21:13)
 

Cкажи только, зачем тебе проверка ($file != ".") и ($file != "..") ?

   
 
 автор: Akira   (11.06.2005 в 21:27)   письмо автору
 
   для: isset   (11.06.2005 в 21:19)
 

Осталось по старой памяти =) Я ведь использовал его в самых разныхситуациях =)
Мне проше было закомментировать is_file($file) чем дописывать ($file != ".") и ($file != "..").
На самом деле они не нужны. Да и скрипт устарел =) glob на много удобнее...

   
 
 автор: isset   (11.06.2005 в 21:31)   письмо автору
 
   для: Akira   (11.06.2005 в 21:27)
 

Glob может и лучше, но тормозной он

   
 
 автор: Akira   (11.06.2005 в 21:37)   письмо автору
 
   для: isset   (11.06.2005 в 21:31)
 

Не разу не заметил.

   
 
 автор: TuX   (12.06.2005 в 15:20)   письмо автору
 
   для: Akira   (11.06.2005 в 21:37)
 

А где можно узнать поподробнее, что такое glob.
Думал здесь найду, но не нашёл :(
http://www.softtime.ru/bookphp/group.php?id_group=0
Вот эта конструкция выводит Array вместо имен файлов, в папке 19 файлов и array выводится 19 раз

<?
$mask 
"baza/*.html"
foreach (
glob($mask) as $filename) {
   echo 
$filename.'<br>';
}
  
?> 

   
 
 автор: Akira   (12.06.2005 в 17:31)   письмо автору
 
   для: TuX   (12.06.2005 в 15:20)
 

glob помешает имена найденных файлов\папок в массив.
Надо учесть, что указываем $mask исходя из места расположения скрипта.
Поробуйте


<? 
$mask 
"baza/*.html"# Задаем маску поиска 
print_r (glob($mask ) ) 
?>



Это выведет все файлы в массиве.

   
 
 автор: TuX   (13.06.2005 в 00:21)   письмо автору
 
   для: Akira   (12.06.2005 в 17:31)
 

Всё, разобрался, всем огромное спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования