Работа с каталогами в php

Алан-э-Дейл       01.03.2024 г.

8 ответов

Лучший ответ

И если вы не хотите загружать весь список в память и избегать блокировки, вы можете взглянуть на .

61

Community
23 Май 2017 в 11:47

Попробуйте это программа класса { static void Main (строка [] аргументы) {

Ris
30 Ноя 2015 в 06:20

1

Tunaki
3 Сен 2016 в 12:16

Это для всех, кто пытается получить список всех файлов в папке и ее подпапках и сохранить его в текстовом документе. Ниже приведен полный код, включая операторы «using», «пространство имен», «класс», «методы» и т. Д. Я постарался как можно больше комментировать код, чтобы вы могли понять, что делает каждая часть. Это создаст текстовый документ, содержащий список всех файлов во всех папках и подпапках любой заданной корневой папки. В конце концов, какой толк в списке (например, в Console.WriteLine), если с ним ничего нельзя сделать. Здесь я создал папку на диске C под названием «Folder1» и создал внутри нее папку «Folder2». Затем я заполнил папку folder2 кучей файлов, папок, файлов и папок в этих папках. Этот пример кода получит все файлы, создаст список в текстовом документе и поместит этот текстовый документ в Folder1. Предупреждение: не следует сохранять текстовый документ в Folder2 (папку, из которой вы читаете), это было бы просто плохой практикой. Всегда сохраняйте его в другую папку. Я надеюсь, что это поможет кому-то в будущем.

2

Aubrey Love
3 Апр 2018 в 17:39

Я не уверен, почему вы добавляете строки в , которое объявлено как поле, а не как временная переменная. Вы можете изменить подпись на:

И после блока добавить:

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

3

Mir
13 Янв 2013 в 16:39

Вы можете использовать что-то вроде этого:

Вместо использования «. » вы можете ввести имя файла или просто его тип, например «* .txt» также SearchOption.AllDirectories предназначен для поиска во всех подпапках, которые вы можете изменить, если вам нужен только один уровень подробнее о том, как его использовать, можно здесь

14

sam
7 Дек 2014 в 00:54

Просто используйте это:

И если вам нужен каждый файл, даже без расширений:

23

Tommaso Belluzzo
13 Янв 2013 в 16:45

Вы можете использовать Directory.GetFiles для замены своего метода.

155

Tilak
13 Янв 2013 в 16:40

COLOPHON

This page is part of release 5.11 of the Linux project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.

  Copyright (C) 1993 David Metcalfe (david(@)prism.demon.co.uk)
%%%LICENSE_START(VERBATIM)
Permission is granted to make and distribute verbatim copies of this

manual provided the copyright notice and this permission notice are

preserved on all copies.
Permission is granted to copy and distribute modified versions of this

manual under the conditions for verbatim copying, provided that the

entire resulting derived work is distributed under the terms of a

permission notice identical to this one.
Since the Linux kernel and libraries are constantly changing, this

manual page may be incorrect or out-of-date.  The author(s) assume no

responsibility for errors or omissions, or for damages resulting from

the use of the information contained herein.  The author(s) may not

have taken the same level of care in the production of this manual,

which is licensed free of charge, as they might when working

professionally.
Formatted or processed versions of this manual, if unaccompanied by

the source, must acknowledge the copyright and authors of this work.

%%%LICENSE_END
References consulted:
    Linux libc source code

    Lewine’s _POSIX Programmer’s Guide_ (O’Reilly & Associates, 1991)

    386BSD man pages

Modified Sat Jul 24 18:26:16 1993 by Rik Faith (faith(@)cs.unc.edu)

Modified Thu Apr 11 17:11:33 1996 by Andries Brouwer (aeb(@)cwi.nl):

    Corrected type of compar routines, as suggested by

    Miguel Barreiro (enano(@)avalon.yaix.es).  Added example.

Modified Sun Sep 24 20:15:46 2000 by aeb, following Petter Reinholdtsen.

Modified 2001-12-26 by aeb, following Joey. Added versionsort.
The pieces on scandirat(3) were copyright and licensed as follows.
Copyright (c) 2012, Mark R. Bannister <cambridge(@)users.sourceforge.net>

       based on text in mkfifoat.3 Copyright (c) 2006, Michael Kerrisk
%%%LICENSE_START(GPLv2+_DOC_FULL)
This is free documentation; you can redistribute it and/or

modify it under the terms of the GNU General Public License as

published by the Free Software Foundation; either version 2 of

the License, or (at your option) any later version.
The GNU General Public License’s references to «object code»

and «executables» are to be interpreted as the output of any

document formatting or typesetting system, including

intermediate and printed output.
This manual is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

GNU General Public License for more details.
You should have received a copy of the GNU General Public

License along with this manual; if not, see

<http://www.gnu.org/licenses/>.

%%%LICENSE_END

Работа с файлами с помощью fopen()

Функций file(), file_get_contents() и file_put_contents() достаточно для решения большинства задач, связанных с управлением файлами.

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

Итак, открыть (или создать и открыть) файл можно с помощью функции fopen():

Функция fopen() возвращает так называемый лескриптор. Это ссылка, указатель на файл, его мы будем передавать в другие функции. Кстати, тип данных этого дескриптора — resource.

Первым параметром мы передаём путь к файлу, вторым — модификатор доступа к файлу. Ниже перечислены наиболее популярные модификаторы:

  • r — открытие для чтения, указатель переходит в начало файла.
  • r+ — открытие для чтения и записи, указатель переходит в начало файла.
  • w — открытие для записи, указатель переходит в начало файла. Если файла нет — создаётся, если есть — очищается от данных.
  • w+ — открытие для чтения и записи, в остальном аналогичен w.
  • a — открытие для записи, указатель переходит в конец файла. Если файла нет — создаётся.
  • a+ — открытие для чтения и записи, в остальном аналогичен a.
  • x — создание и открытие для записи, указатель переходит в начало файла. Если файл существует — PHP покажет ошибку.
  • x+ — создание и открытие для чтения и записи, в остальном аналогичен x.

Указатель — это нечто вроде курсора. Вы можете переместить его в любое место файла, чтобы добавить или отредактировать определённые данные.

Для записи данных в файл существует функция fwrite(). Давайте попробуем создать файл и записать в него какие-нибудь данные:

Заметьте, из-за модификатора w при каждом запуске скрипта данные в файле стираются и добавляются заново. Если модификатор заменить на a, данные будут не перезаписываться, а добавляться в конец файла.

Для построчного чтения файла используется функция fgets():

При каждом запуске fgets получает следующую строку и возвращает её в $line. Вторым параметром передаётся максимальная длина строки. Это означает, что если строка слишком длинная, она будет обрезана.

Включение внешних файлов

В каждый PHP-документ можно включить файл с помощью инструкции
include(). Её аргумент: путь к файлу. Этой инструкцией удобно
пользоваться при наличии одинаковых кусков кода во многих PHP-программах.
Содержимое включаемого файла обрабатывается как простой HTML-текст.
Для того, чтобы содержимое этого файла обрабатывалось как PHP-программа, нужно
обрамлять его открывающим и закрывающим тегами PHP.

Пример 1

Включаемый файл top.php с PHP-программой:

В данном случае результат будет тем же, если включаемый файл top.php
содержит только строку HTML-текста:

Включаемые файлы могут возвращать значения подобно функциям. Использование
оператора return прерывает выполнение этого файла так же, как и
функции.

Пример 2

Включаемый файл top.php с PHP-программой:

Инструкцию include() можно использовать внутри цикла.
В цикле include() выполняется при каждой итерации. Это можно
использовать для включения нескольких файлов. Например:

Определение имени включаемого файла и его загрузка производятся повторно при
каждом вызове include(). Это означает, что если содержание
включаемого файла с момента предыдущего вызова изменилось, то загрузится новое
содержание.

Оператор include() также можно включать в тело условного оператора.

Несмотря на сходство по внешнему виду с функцией, include()
функцией не является, а представляет собой специальную конструкцию языка.

Для указания что файл нужно подключать только один раз используется оператор include_once()

Управление файлами

PHP содержит множество функций управления файлами.
Наиболее употребимыми являются:

  • touch() — создает пустой файл с заданным именем. Если такой
    файл уже существует, то функция изменит дату модификации. Например:
    touch( "ex1.txt" );
    
  • copy() — копирует файл.
    Для копирования файлов в php применяется функция copy ($source, $result). Ей нужно передать лишь два
    параметра
    — источник $source и имя файла-копии — $result. Стоит отметить, что следует указывать полные адреса к
    файлам.
    Пример применения функции copy:
  • unlink() — удаляет заданный файл. Например:

  • fopen( ) — открывает локальный или удаленный файл и возвращает
    указатель на него. Указатель используется во всех операциях с содержимым файла.
    Аргументы: имя файла и режим открытия.
    r чтение. Указатель файла устанавливается на его начало
    r+ чтение и запись. Указатель файла устанавливается на его начало
    w запись. Указатель файла устанавливается на его начало.
    Все старое содержимое файла теряется. Если файл с указанным именем не
    существует, функция пытается его создать
    w+ чтение и запись. Указатель файла устанавливается на его начало.
    Все старое содержимое файла теряется. Если файл с указанным именем не
    существует, функция пытается его создать
    a запись. Указатель файла устанавливается на его конец.
    Если файл с указанным именем не существует, функция пытается его создать
    a+ чтение и запись. Указатель файла устанавливается на его конец.
    Если файл с указанным именем не существует, функция пытается его создать

    Например:

    Если открыть файл не удалось, то можно прервать выполнение программы. Например:

    $fp = fopen( "ex1.txt", "w" ) or die ( "Не удалось открыть файл" );
    
  • fclose() — закрывает файл. Аргумент: указатель файла,
    полученный ранее от функции fopen(). Например:
    fclose( $fp );
    
  • feof() — проверка конца файла. Аргумент: указатель файла.
  • fgetc() — чтение очередного символа из файла. Аргумент:
    указатель файла.
  • fgets() — чтение очередной строки файла. Аргументы: указатель файла
    и длина считываемой строки. Операция прекращается либо после считывания
    указанного количества символов, либо после обнаружения конца строки или файла.
  • fread() — общая функция чтения из файла. Аргументы: указатель файла
    и количество считываемых символов.
  • fseek() — отступ от начала файла. Аргументы: указатель файла
    и смещение.
  • fputs() — запись строки в файл. Аргументы: указатель файла
    и строка.
  • fwrite() — полный аналог функции fputs( ).
  • flock() — блокирует файл, т.е. не позволяет другим пользователям
    читать этот файл или писать в него, пока тот, кто наложил блокировку не
    закончит работу с данным файлом.
    Аргументы: указатель файла и номер режима блокировки.
    1 Можно читать, нельзя писать
    2 Нельзя ни читать, ни писать
    3 Снятие блокировки

    Пример 7

    Блокировка с помощью flock() не является абсолютной. С ней
    будут считаться только те программы, которые тоже используют эту функцию.

В PHP версии 4.3.0 появились новые удобные функции работы с файлами:

  • file_get_contents() — прочитать весь файл или URL
  • file_put_contents() — записать файл

Список файлов определенного типа

При работе с папками и файлами может потребоваться найти файлы определенных типов. Например, только файлы .text или .png. Для этого предназначена функция glob(). которая осуществляет поиск файлов по заданному шаблону.

В приведенном ниже примере PHP найдет в папке все файлы с расширением .text. Данный пример не будет искать подкаталоги, как и PHP scandir().

Пример:

<?php
        /* Поиск каталога и цикл по возвращенному массиву, содержащему обозначенные файлы */
       foreach(glob("documents/*.txt") as $file){
  	    echo basename($file) . " (size: " . filesize($file) . " bytes)" . "<br>";
       }
        ?>

Функция glob() также используется для нахождения всех файлов в каталоге или подкаталоге.

Пример:

<?php
        // Определение функции для вывода файлов из каталога
       function outputFiles($path){
  	    // Проверка существования каталога
          if(file_exists($path) && is_dir($path)){
              // Поиск файлов в каталоге 
  	        $files = glob($path ."/*");
  	        if(count($files) > 0){
  	            // Циклический обход возвращённого массива
  	            foreach($files as $file){
  	                if(is_file("$file")){
  	                    // Отображаем только имя файла
  	                    echo basename($file) . "<br>";
                      } else if(is_dir("$file")){
                          // Рекурсивно вызываем функцию, если каталоги найдены 
  	                    outputFiles("$file");
  	                }
  	            }
  	        } else{
                  echo "ERROR: No such file found in the directory.";
  	        }
  	    } else {
              echo "ERROR: The directory does not exist.";
  	    }
       }
  	 
        // Вызвать функцию 
       outputFiles("mydir");
        ?>

Пожалуйста, оставляйте свои мнения по текущей теме статьи. За комментарии, лайки, подписки, отклики, дизлайки низкий вам поклон!

КККонстантин Кондрусинавтор статьи «PHP Parsing Directories»

Сохранение списка файлов с помощью командной строки

Вначале вам необходимо будет перейти к нужной папке, или диску, если вы хотите получить список файлов, которые находятся на диске. После открытия папки или диска, удерживая на клавиатуре кнопку «Shift», кликните правой кнопкой мыши внутри этой папки. В открывшемся контекстном меню выберите пункт «Открыть окно команд».

После этого откроется окно консоли, в которой уже будет указан путь к нужной директории (в вашем случае, будет к той папке, которую вы откроете). В этом примере, это папка «Программы» на Рабочем столе моего компьютера. В этой папке находятся другие папки, в которых находятся ярлыки программ.

Далее нужно будет ввести одну из этих команд:

dir /b>filelist.txt dir /s>filelist.txt

После ввода «dir» должен быть пробел. Вместо «filelist» может написать свое название файла, только латинскими буквами. Не забудьте в конце добавить формат «.txt».

Эти команды отличаются друг от друга в использовании дополнительных критериев сохранения списка файлов:

  • /b — обозначает, что будут сохранены только имена файлов.
  • /s — обозначает, что дополнительно в список будут включены все файлы и подкаталоги (подпапки), которые находятся в этой папке.

Затем на клавиатуре нажмите на кнопку «Enter».

После этого вы можете открыть папку и увидеть, что в папке находится текстовый файл «filelist». Теперь можете открыть этот файл с помощью Блокнота.

Если в данной папке некоторые файлы имели русские имена, то вместо имен этих файлов, вы увидите непонятные символы (крякозябры). Дело в том, что программа Блокнот не понимает кодировку MS-DOS.

Поэтому, открыть созданный файл, можно будет с помощью программы Word. Предполагаю, что у большинства пользователей, на компьютере установлена данная программа.

Кликните по текстовому файлу правой кнопкой мыши, а затем в контекстном меню выберите пункт «Открыть с помощью». Выберите для открытия файла программу Microsoft Office Word. В окне программы Word будет открыто окно «Преобразование текста», в котором нужно будет выбрать кодировку MS-DOS, которая позволит прочитать этот документ.

На образце вы увидите правильное отображение текста.

После нажатия на кнопку «ОК», данный текст будет открыт в программе Word. Вы можете провести редактирование документа, а потом сохранить его на компьютере в нужном формате, в том числе в формате «TXT». Проблем с кодировкой после сохранения файла уже не будет.

The Basic Solutions

The first set of approaches demonstrate the use of the functions , a combination of the functions , and , and the the function .

Using glob()

The first function to discuss is which allows us to perform a search for pathnames using wildcards common to the best known shells. The function has two parameters:

  • (mandatory): The search pattern
  • (optional): One or more flags as listed in the official documentation

Let’s see some examples! To search in the directory for all files and directories that end with .txt, you would write:

If you display , the output will be:

array (
  0 => 'article.txt',
  1 => 'text.txt'
)

If you want a list of files and directories that begin with “te”, the code to write is:

The output is:

array (
  0 => 'test.dat',
  1 => 'text.txt'
)

To get a list of directories only which contain “ma”, the code is:

In this last example, the output is:

array (
  0 => 'manager'
)

Notice that the last example makes use of the constant as the optional second parameter. As you can see, the file called is excluded because of it. Although the function is easy to use, it isn’t so flexible sometimes. For example, it doesn’t have a flag to retrieve only files (and not directories) that match a given pattern.

Using opendir() and readdir()

The second approach to read files and directories I’d like to discuss involves the functions , , and .

opens the directory and returns a connection handle. Once the handle is retrieved, you can use . With each invocation, this function will give the name of the next file or directory inside an opened directory. When all the names have been retrieved, the function returns false. To close the handle you use .

Unlike , this approach is a bit more involved since you don’t have parameters that help you filter the returned files and the directories. You have to perform post-filtering yourself to get what you want.

To parallel with the function, the following example retrieves a list of all the files and the directories that start with “te”:

The output is the same as the previous example.

But if you execute the code above and output the value of as it runs, you’ll see it contains some odd-looking entries at times: “.” and “..”. These are two virtual directories you’ll find in each directory of the file system. They represent the current directory and the parent directory (the up-level folder) respectively.

The second example shows how to retrieve only the files contained in a given path.

As you might guess, using the above code produces the following output:

array (
  0 => 'article.txt',
  1 => 'master.dat',
  2 => 'script.php',
  3 => 'test.dat',
  4 => 'text.txt'
)

Using scandir()

And finally, I’d like to present the function. It has only one mandatory parameter: the path to read. The value returned is an array of the files and directories contained in the path. Just like the last solution, to retrieve a subset of files and directories, you have to do post-filtering yourself. On the other hand, as you can see by looking at the code below, this solution is more concise and doesn’t need to manage file handle.

This example shows how to retrieve files and directories which start with the string “te”:

Получение списка файлов в папке с помощью bat файла

Один из самых доступных и простых способов получения списка файлов в папке: использование для этого специального bat файла. Существует несколько вариантов создания файла с расширением «.bat», с разным кодом.

Для создания bat файла вам нужно будет открыть Блокнот, а затем вставить туда этот код:

chcp 1251
echo %date% %time% >filelist.txt
dir /b /d >>filelist.txt

Сохраните этот файл, имя файлу можете дать любое, самому файлу нужно дать расширение «BAT». Параметры сохранения файла в Блокноте будут выглядеть примерно так:

  • Имя файла: filelist.bat
  • Тип файла: Все файлы

После этого нажмите на кнопку «Сохранить».

Далее помещаете созданный файл в ту папку, из которой вы хотите получить, список находящихся там файлов. После этого, запустите файл с расширением «.bat». В данной папке будет создан файл «filelist» в формате «.txt», в котором будет находиться список файлов.

Существует несколько вариантов содержимого файла с расширением «.bat». При использовании этого метода, проблем с кодировкой не возникнет.

Glob

Получить список файлов и директорий на PHP можно с помощью встроенной функции PHP glob(). Официальная документация использования функции glob() находится .

Список файлов и всех поддиректорий

$path = ‘my_dir’;$result = glob($path.’/*’);print_r($result);

В результате выполнения функции glob() будет получен массив, содержащий все каталоги и почти все файлы, заданной в переменной $path директории, без элементов «.», «..» (точка — указывает на текущую директорию, две точки — предыдущая директория), которые, к примеру, будут прочитаны при использовании функции readdir() или scandir(). Почти все, а не все файлы будут получены потому, что шаблон «*» не включает файлы, начинающиеся с символа точки, например: .htaccess. Чтобы получить список всех файлов — можно использовать шаблон с константой, опубликованные ниже:

Список ВСЕХ файлов и всех поддиректорий

$result = glob(‘my_dir/{,.}*’, GLOB_BRACE);

При использовании шаблона {,.} будут показаны не только файлы, начинающиеся с точки, но и директории-точки (точка и две точки, если есть вышестоящая директория) — при необходимости их нужно дополнительно отфильтровать, например при помощи условного оператора if().

Вообще, функция glob() существует для поиска файлов и директорий, в соответствии с заданным шаблоном. То есть с ее помощью лучше искать, например, все файлы с расширением jpg. Казалось бы, нет ничего проще: указываем шаблон *.jpg и ищем, но если расширение файла написано не только прописными буквами, например Jpg, то в регистрозависимых файловых системах, таких, как в операционных системах FreeBSD, Linux и подобных, это задание вызовет некоторые трудности. Пример, задания регистронезависимого поиска по шаблону — нужно найти все файлы, с расширением jpg, JPG, jPG и подобные:

Регистронезависимый поиск по шаблону

$result = glob(‘my_dir/*/number?/*.’);

Более подробнее про синтаксис шаблона glob() можно прочитать тут: «».

Если порядок сортировки файлов и директорий на выходе функции glob() не важен — необходимо использовать константу GLOB_NOSORT. В этом случае функция будет работать заметно быстрее.

Как получить в PHP список файлов в папке

Можно использовать PHP scandir(), чтобы получить список всех файлов, которые содержит папка.

Пример:

<?php
        // Определение функции для вывода файлов в каталог 
       function outputFiles($path){
  	    // Проверка на существование каталога 
          if(file_exists($path) && is_dir($path)){
              // Проверка файлов в каталоге 
  	        $result = scandir($path);
  	   
              // Отфильтровать данный (.) и предыдущего уровня (..) каталоги 
              $files = array_diff($result, array('.', '..'));
              
  	        if(count($files) > 0){
  	            // Обход возвращенного массива
  	            foreach($files as $file){
                      if(is_file("$path/$file")){
  	                    // Отображение имени файла 
  	                    echo $file . "<br>";
                      } else if(is_dir("$path/$file")){
                          // Рекурсивно вызываем функцию, если каталоги найдены 
  	                    outputFiles("$path/$file");
  	                }
  	            }
  	        } else{
                  echo "ERROR: No files found in the directory.";
  	        }
  	    } else {
              echo "ERROR: The directory does not exist.";
  	    }
       }
  	 
        // Название имени файла 
       outputFiles("mydir");
        ?>

Использование заголовочных файлов стандартной библиотеки

Рассмотрим следующую программу:

Эта программа печатает «Hello, world!» в консоль с помощью . Однако эта программа никогда не предоставляла определение или объявление для , поэтому как компилятор узнает, что такое ?

Ответ заключается в том, что был предварительно объявлен в заголовочном файле «iostream». Когда мы пишем , мы запрашиваем, чтобы препроцессор скопировал всё содержимое (включая предварительные объявления для ) из файла с именем «iostream» в файл, выполняющий .

Ключевой момент

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

Подумайте, что бы произошло, если бы заголовок не существовал. Каждый раз, когда вы хотели бы использовать , вам приходилось бы вручную вводить или копировать все объявления, связанные с , в начало каждого файла, который использовал бы ! Для этого потребуется много знаний о том, как реализован , и потребуется много работы. Хуже того, если бы прототип функции изменился, нам пришлось бы вручную обновлять все предварительные объявления. Намного проще просто включить iostream с помощью !

Когда дело доходит до функций и переменных, стоит помнить, что заголовочные файлы обычно содержат только объявления функций и переменных, а не их определения (в противном случае может произойти нарушение правила одного определения). объявлен в заголовке iostream, но определен как часть стандартной библиотеки C++, которая автоматически подключается к вашей программе на этапе линкера.

Рисунок 1 – Диаграмма процесса сборки

Лучшая практика

Заголовочные файлы обычно не должны содержать определений функций и переменных, чтобы не нарушать правило одного определения. Исключение сделано для символьных констант (которые мы рассмотрим в уроке «4.14 – const, constexpr и символьные константы»).

Conclusion

This article gave a wonderful insight into the world of PHP scandir and how it can be effectively used to carry out relevant tasks. Let’s discuss the main points discussed in it, that you must know about the scandir() function:

  • We first saw how it can be used to get specific files from certain directories and folders
  • Next, we looked at the parameters that are accepted by the scandir() function to ensure a successful implementation and return the intended value
  • After that, we assessed various exceptions and errors that have to be considered, at all times, during the utilization of the scandir() function
  • We also discussed the working of scandir PHP and how relevant variables and values make up a systemic approach
  • This approach leads to the return of an array containing all directories or files in the relevant sorted or unsorted order
  • We specifically discussed simple examples that highlighted the usage of the scandir() function to carry out different tasks
  • These tasks included the return of an array with files and directories in the ascending order, descending order, and unsorted order as well
  • Scandir PHP can also be involved in an implementation which enables users to travel between directories and folders
  • Finally, the article also talked about the usage of the scandir() function in the deletion of files to empty their folders


implementation of the scandir() function

Примеры использования функций

Список поддиректорий и файлов

С помощью функции bfglob() можно записать пути всех директорий, поддиректорий и файлов, находящихся в них, в одномерный массив. Эта функция взята из официальной документации по PHP из комментариев к странице с описанием glob() и немного усовершенствована. Эта функция не использует рекурсию — применен простой, но полностью рабочий механизм с использованием функций по работе с массивами.

// $path — путь к директории// $pattern — шаблон поиска// $flags — константа для функции glob()// $depth — глубина вложенности, просматриваемая функцией. -1 — без ограничений.function bfglob($path, $pattern = ‘*’, $flags = GLOB_NOSORT, $depth = )
  {
  $matches = array();
  $folders = array(rtrim($path, DIRECTORY_SEPARATOR));
  while($folder = array_shift($folders))
    {
    $matches = array_merge($matches, glob($folder.DIRECTORY_SEPARATOR.$pattern, $flags));
    if($depth != )
      {
      $moreFolders = glob($folder.DIRECTORY_SEPARATOR.’*’, GLOB_ONLYDIR);
      $depth   = ($depth < -1) ? -1 $depth + count($moreFolders) — 2;
      $folders = array_merge($folders, $moreFolders);
      }
    }
  return $matches;
  }
 $file = bfglob(‘my_dir’, «*», GLOB_NOSORT, -1);print_r($file);

Стоит обратить внимание, на константу DIRECTORY_SEPARATOR, использующуюся в функции bfglob(). Эта константа хранит символ, разделяющий директории, для операционной системы, под управлением которой запущен скрипт: например Linux понимает только «/», Windows, по умолчанию использует разделитель директорий «\», но понимает и «/»

Если функция bfglob() будет запускаться из под различных операционных систем, с последующим хранением результатов работы — желательно заменить константу DIRECTORY_SEPARATOR на символ «/», чтобы избежать проблем с несовместимостью путей.

Рекурсивное удаление файлов и директорий

Как удалить не пустую директорию с использованием PHP? Ниже — пример двух функций, которые извлекают списки путей ко всем файлам и директориям. Отличия от пользовательской функции bfglob() — на выходе пути к директориям и файлам лежат в разных ячейках массива и подсчитывается общий объем занимаемого файлами места. Если раскомментировать unlinc() и rmdir() — будут также удалены все файлы, по заданному пути

ВНИМАНИЕ: перед тем, как запустить процесс удаления файлов и директорий следует несколько раз проверить, что вы собираетесь удалить именно то, что нужно!

$dir = ‘MyDir’;function remove_all_g($dir, $result = array())
  {
  if ($paths = glob($dir.’/*’, GLOB_NOSORT))
    {
    foreach($paths as $path)
      {
      if (is_dir($path))
        {
        $result = remove_all_g($path, $result);
        }
      else
        {
        $result’path»file’ = $path;
        $result’counter_filesize’ += filesize($path);
        //unlink($path);
        }
      }
    }
  $result’path»dir’ = $dir;
  //rmdir($dir);
  return $result;
  }print_r(remove_all_g($dir));function remove_all_sd($dir, $result = array())
  {
  if ($paths = array_diff(scandir($dir), array(‘..’, ‘.’)))
    {
    foreach($paths as $path)
      {
      if (is_dir($dir.’/’.$path))
        {
        $result = remove_all_sd($dir.’/’.$path, $result);
        }
      else
        {
        $result’path»file’ = $dir.’/’.$path;
        $result’counter_filesize’ += filesize($dir.’/’.$path);
        // unlink($dir.’/’.$path);
        }
      }
    }
  $result’path»dir’ = $dir;
  // rmdir($dir);
  return $result;
  }print_r(remove_all_sd($dir));

Функция remove_all_g() для чтения содержимого директории применяется glob(), в remove_all_sd() — scandir(). При работе с 10 000 файлов, расположенных в 200 директориях различного уровня вложенности, функция remove_all_sd() отрабатывала, приблизительно на 20% быстрее.

Также, функция remove_all_g() не обнаруживает файлы, начинающиеся с точки, а если добавить ей эту функциональность — работать она будет еще медленнее.

Вывод: функцию glob() для рекурсивного чтения файлов, директорий и поддиректорий следует использовать только на PHP ниже 5 версии, во всех остальных случаях, выбор между функциями glob() и scandir() очевиден.

Опубликовано: 2012/04/30

HTML-код ссылки на эту страницу:
<a href=»https://petrenco.com/php.php?txt=133″ target=»_blank»>Списки файлов и директорий на PHP</a>

33412

Заключение

В данном уроке демонстрируется использование различных подходов для достижение одинаковой цели: получение списка файлов и директорий. Следует запомнить следующие ключевые моменты:

  • Функция является встроенным решением, но она недостаточно гибкая.
  • Решение на основе , , и более сложное и требует дополнительной фильтрации, но оно более гибкое.
  • Функция требует дополнительной фильтрации, но работает без обработки дескриптора.
  • Если вы используете подход ООП, то следует применять библиотеку SPL. Дополнительно вы можете расширить классы своим функционалом.
  • Итератор имеет функцию предварительной фильтрации, а другие используют .
Гость форума
От: admin

Эта тема закрыта для публикации ответов.