Работа с файлами в PHP часть 2 (PHP_EOL, file, scandir, is_file, is_dir, mkdir, rmdir, scandir)

В предыдущей части стати "Работа с файлами в PHP часть 1 (file_get_contents, file_put_contents, file_exists, unlink, rename, copy, filesize)" были рассмотрены простейшие функции для чтения, записи, удаления, перемещения, копирования, переименовывания и проверки существования файлов. В этой части статьи мы поговорим об операциях над папками, об окончаниях строк и простом построчном способе чтения файла в массив.

Перенос строки

Вы можете встретить конец в каждом файле на номпьютере. Мы его не видим, но без конча строки было бы намного тяжелее читать тексты, программировать и вообще воспринимать информацию. Существует символ конца строки. Этот символ мы не видим, но он переносит текст на другую строку. Символ конца строки может быть разный, в зависимости от операционной системы, в которой вы работаете. В PHP можно напечатать символ конца строки несколькими способами:
<?php 
   $file = $_SERVER['DOCUMENT_ROOT'] . '/mouse.txt';

   $content = 'Тише, мыши, кот на крыше' . "\n";
   file_put_contents($file, $content);

   $content = 'Тише, мыши, кот на крыше' . "\r\n";
   file_put_contents($file, $content);

   $content = 'Тише, мыши, кот на крыше' . "\r";
   file_put_contents($file, $content);
?>
Теперь откроем записанный файл mouse.txt и посмотрим на его содержимое. Все эти три команды из примера выводят строку текста и символ конца строки в конце. В каких-то системах все три способа будут работать, в каких-то он будут срабатывать неправильно (чаще всего как двойной перенос строки).
Обратите внимание, что во всех примерах используются двойные кавычки ". Если использовать одинарные кавычки (содержимое которых не проверяется компилятором на наличие спецсимволов и переменных), то будет выведен не символ конца строки, а текст, к примеру, \n.
Чтобы уйти от необходимости выяснять правильный символ конца строки в операционной системе, используется константа PHP_EOL. В неё записывается тот символ конца строки, который используется в системе.
<?php 
   $file = $_SERVER['DOCUMENT_ROOT'] . '/mouse.txt';

   $content = 'Тише, мыши, кот на крыше' . PHP_EOL;
   file_put_contents($file, $content);
?>

Чтение файла построчно в массив

Одна из самых распространённых задач с файлами - это получение всех строк файла. Для этого лучше всего воспользоваться функцией file, которая прочитает файл и запишет его содержание в массив. Один элемент массива будет равен одной строке файла. Разберём пример:
<?php 
   $a = array();
   $file = $_SERVER['DOCUMENT_ROOT'] . '/mouse.txt';

   $a = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
   foreach($a as  $line_num => $line){
      echo $line . '<br>';
   }
?>
В переменную $a будет записан массив из строк, хранящихся в файле. Вторым параметром функции file указаны два флга через вертикальный разделитель |.

Флаг FILE_IGNORE_NEW_LINES запрещает перенос в результирующий массив символов конца строки. Если флага FILE_IGNORE_NEW_LINES не будет, то в массиве окажутся строки с символами конца строки.

Второй флаг FILE_SKIP_EMPTY_LINES заставлет пропускать пустые строки файла. Поэтому пустые строки не попадут в результирующий массив.

Как и функции file_get_contents в функцию file необходимо передать полный путь к файлу в системе.

В случае ошибки функция file возвращает false.

Проверка является ли файлом или папкой

Иногда появляется необходимость проверить является ли объект файлом или папкой. Для этого подойдут функции is_file и is_dir. Обе функции принимают только один параметр - путь файла в системе.Функция is_file возвращает true, если объект является файлом и false, если нет. Функция is_dir возвращает true, если объект является папкой и false, если нет. Чаще всего эти функции используются непосредственно внутри условия if( ). Попробуем использовать их:
<?php 
   $a = $_SERVER['DOCUMENT_ROOT'] . '/mouse.txt';
   if(is_file($a)){
      echo 'Это файл';
   }

   $a = $_SERVER['DOCUMENT_ROOT'] . '/mouse/';
   if(is_dir($a)){
      echo 'Это папка';
   }
?>

Создание папки

Функция mkdir в PHP создаёт папки. У этой функции есть при параметра. В первом параметре она принимает полный путь к новой папке в системе. Через второй параметр она получает уровень доступа к папке (в восьмиричной системе, примеры будут ниже). И третий параметр может быть true или false, в зависимости от того, надо ли создавать все папки в пути (если поставить false, то можно создать только одну папку. Если true, то можно создать цепочку из вложенных в друг друга папок). Попробуем привести пример с использованием этой функции:
<?php 
   $file = $_SERVER['DOCUMENT_ROOT'] . '/home/mouse/';
   mkdir($file, 0755, true);
?>
В результате выполнения этого кода будет создана папка /mouse/ внутри папки /home/. Если папки /home/ не существовала, то она тоже будет создана, потому что в третьем параметре функции mkdir стоит true.
Рекомендуем устанавливать права на файлы - 0644 и на папки - 0755
Функция mkdir возвращает true в случае успешного создания папки.

Удаление папки

С помощью функции rmdir можно удалить папку. Эта функция принимает полный путь к удаляемому файлу в системе. В случае успешного удаления возвращает true. Приведём пример её использования. Как при любом удалении, сначала проверим существует ли объект, который надо удалить:
<?php 
   $a = $_SERVER['DOCUMENT_ROOT'] . '/home/mouse/';
   if(is_dir($a)){
      rmdir($a);
   }
?>

Чтение содержимого папки

Иногда появляется необходимость используя PHP узнать содержимое папки: то есть получить список файлов и папок внутри неё. С этой задачей поможет функция scandir. У неё два параметра: первый - это полный путь к папке, в которой надо проводить сканирование, а второй - порядок сортировки (по умолчанию сортировка идёт по имени файла в прямом порядке. Если вторым параметром поставить еиницу 1, то будет в обратном порядке). Функция возвращает массив из названий файлов
<?php 
   $a = $_SERVER['DOCUMENT_ROOT'] . '/home/';
   $b = scandir($a);
   echo '<pre>';
   print_r($b);
   echo '</pre>';
?>
Резльутат выполнения этого скрипта будет содержать список файлов и папок в дериктории. Но только первого уровня. То есть в результат не попадут файлы и папки, которые являются вложенными.

Чтобы получить весь список файлов и сделать рекурсивный обход всех вложенных папок, необходимо использовать рекурсивную функцию. Её реализация может быть такой:
<?php 
   function GetAllFiles($dir, &$results = array()){
      $files = scandir($dir);
      foreach($files as $key => $value){
         $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
         if(!is_dir($path)) {
            $results[] = $path;
         }elseif($value != "." && $value != ".."){
            GetAllFiles($path, $results);
            $results[] = $path;
         }
      }

      return $results;
   }

   $a = $_SERVER['DOCUMENT_ROOT'] . '/home/';
   $b = GetAllFiles($a);

   echo '<pre>';
   print_r($b);
   echo '</pre>';
?>
В результате выполнения такого кода в переменной $b окажется массив, состоящий из путей ко всем файлам и папкам, вложенным в папку /home/. В том числе пути ко всем файлам в подпапках и пути к самим папкам.

Обратите внимание, что в примере, внутри функции GetAllFiles, происходит вызов этой же самой функции GetAllFiles. Именно поэтому функция называется рекурсивной.

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

Константа DIRECTORY_SEPARATOR служит для вывода разделителя в адресах файлов. К примеру, если в Linux используются "/" для разделения папок в адресах, то в Windows используется обратный слеш "\". Чтобы не задумываться над тем, какой нужно поставить, можно использовать константу DIRECTORY_SEPARATOR. В ней находится нужный разделитель для текущей системы.
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, покупка SSL сертификатов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Была ли эта статья полезна? Есть вопрос?
Cмотрите другие статьи: