Php функции работы с файлами и папками. Управление файлами и каталогами. Операции с каталогами

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

Начнём с самого простого: создание каталога в PHP :

mkdir("new_dir");
?>

После запуска этого скрипта у Вас будет создан пустой каталог "new_dir ".

Удалить пустой каталог очень просто. Для этого используется функция rmdir() .

rmdir("new_dir");
?>

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

  1. Открыть каталог.
  2. Считать содержимое.
  3. Закрыть каталог.

Чтобы не мучить Вас в ожиданиях, сразу приведу код, который выводит имена файлов и категорий внутри заданного каталога:

$dir = opendir("images");
while (($f = readdir($dir)) !== false)
echo $f."
";
closedir($dir);
?>

В результате Вы увидите список всех файлов и каталогов внутри каталога "images ". Также Вы увидите два интересных имени ". " и ".. ". Первый означает "текущий каталог ", а ".. " - родительский.

Теперь подробно о функциях, используемых в этом примере:

  • Функция opendir(string $path) - открывает каталог, находящийся по пути $path , а также возвращает дескриптор, необходимый для работы с этим каталогом.
  • Функция readdir(resource $dir) - считывает текущий элемент в каталоге dir . Текущий элемент задаётся указателем, который сдвигается при каждом вызове. Поэтому получается, что каждый раз эта функция возвращает новый элемент из каталога. Когда все элементы закончились, то функция readdir() возвращает false .
  • Функция closedir(resource $dir) - закрывает каталог dir .

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

Последнее обновление: 1.11.2015

Перемещение файла

Для перемещения файла применяется функция rename() :

Если у нас в каталоге файла hello.txt имеется подкаталог subdir , то файл будет в него перемещен. Если файл был успешно перемещен, функция возвратит значение true .

Копирование файла

Для копирования файла используется функция copy() . Она принимает имя копируемого файла, и имя копии файла. И если копирование прошло успешно, возвращает значение true:

Удаление файла

Для удаления файла применяется функция unlink , которая принимает имя файла и возвращает значение true при успешном удалении файла:

Создание каталога

Для создания каталога используется функция mkdir() :

If(mkdir("newdir")) echo "Каталог создан"; else echo "Ошибка при создании каталога";

В данном случае mkdir создает новый каталог "newdir" в текущем каталоге. Если создание пройдет успешно, то функция возвращает значение true , иначе - false

Для создания новой папки в корневом каталоге можно использовать выражение mkdir("/newdir") .

Удаление каталога

Для удаления каталога применяется функция rmdir() . Ее использование аналогично mkdir():

If(rmdir("newdir")) echo "Каталог удален"; else echo "Ошибка при удалении каталога";

Операции с каталогами

Для получения абсолютного пути к текущему каталогу используется функция getcwd() , которая возвращает путь в виде строки:

$path = getcwd(); echo $path; // C:\localhost

Функция opendir() открывает определенный каталог для считывания из него информации о файлах и каталогах. При успешном открытии каталога функция возвращает дескриптор открытого каталога. После окончания работы с каталогом его надо закрыть функцией closedir() .

Для считывания имени отдельного файла в открытом каталоге применяется функция readdir() .

Теперь объединим эти функции и выведем на страницу все файлы и подкаталоги из текущего каталога:

"; else echo "файл: $file
"; } closedir($dh); // закрываем каталог } } ?>

Ей необходимо передать два параметра: первый - имя файла (строка), второй - режим (тоже строка). Возвращает функция значение типа Ресурс. В дальнейшем оно будет использоваться другими функциями, работающими с файлами.
Если файл находится в текущей директории, то достаточно указать только его имя (без пути). Если же он находится в другом месте, нужно указать полый путь. Для смены текущей директории используется функция . Ей необходимо сообщить имя каталога, который мы хотим сделать текущим. Если сменить каталог не удастся, функция вернет false.
Чтобы узнать какой каталог текущий в данный момент, используйте .
О всех режимах вы можете узнать в описании функции, а с остальными мы познакомимся в этой главе.

Обработка файла обычно включает в себя чтение и/или запись. Давайте рассмотрим несколько функций, осуществляющих чтение файла.
. Первый параметр - указатель на ресурс. Тот самый, который нам вернула функция fopen(). Второй параметр - необязательный - количество байт, которое необходимо считать. Функция считывает указанное количество байт, либо меньше, если раньше встретит конец строки или конец файла. Возвращает она считанную строку.
принимает имя файла и возвращает его содержимое одной строкой.
принимает имя файла и возвращает его содержимое в виде массива строк.
При использовании двух последних функций открывать файл функцией fopen() не надо. Они сами всё сделают.
Для записи в файл используются следующие функции:
. Первый параметр - указатель на ресурс, второй - строка, которую мы записываем.
принимает строку - имя файла и строку, которую необходимо записать.

Закрывает файл функция . Ей нужно передать указатель на ресурс.
Давайте на примере посмотрим действие этих функций. Пусть в директории /usr/tmp в файле f1.txt хранятся числа. По одному в каждой строке. Нам надо считать это число, увеличить и записать в файл f2.txt.

chdir ("/usr/tmp" );
$src = fopen ("f1.txt" , "r" ); // "r" указывает функции открыть файл для чтения
$dst = fopen ("f2.txt" , "w" ); // "w" указывает функции открыть файл для записи
while (! feof ($src )) {
$line = fgets ($src , 16 );
$line ++;
fputs ($dst , $line );
}
fclose ($dst );
fclose ($src );
?>

Здесь вы увидели новую функцию которая возвращает true если после очередной операции достигнут конец файла.
Функции работы с каталогами.
Мы только что узнали две функции работы с каталогами (кстати какие?) Но, как вы догадываетесь, их не две.
Итак, как и файл, директорию необходимо открыть, а в конце работы закрыть. Делают это функции и.
Первая принимает строку - путь к каталогу и возвращает дескриптор каталога (либо false, если не удалось открыть), вторая принимает тот самый дескриптор и ничего не возвращает.

Немного отступлюсь. Есть еще функция . Она принимает путь к каталогу и возвращает в виде массива список всех элементов каталога. Открывать папку функцией opendir() в данном случае не нужно.

Также, оказывается, в PHP есть встроенный класс для работы с директориями. Называется он dir . Он содержит путь, дескриптор, а также методы чтения, закрытия и сброса дескриптора. Как им пользоваться вы поймете, когда изучите ООП.

Так... вернемся назад к нашей readdir(). Получили вы имя очередного элемента каталога. Что же теперь с ним делать? Можно, например, вывести на экран, записать в файл, можно еще что-нибудь придумать.
Например, можно узнать, что это за элемент (еще одна папка, файл, ссылка). для этого существуют соответствующие функции. Функция принимает строку (путь к элементу с его именем) и возвращает true в случае, если это папка, иначе false. Аналогично работают и . Также определить тип элемента можно функцией , передав ей имя файла. Функция вернет строку с одним из следующих значений: fifo, char, dir, block, link, file или unknown.

Что же можно делать с директорией после того, как мы ее открыли?
Например, можно узнать, что в ней есть. Функция принимает дескриптор каталога, полученный после использования opendir() и возвращает имя очередного элемента каталога. Под элементами каталога имеется в виду папка или файл, который в нем расположен. Если вызвать эту функцию после получения имени последнего элемента каталога, она вернет false. Определив, что это за элемент, мы можем сделать с ним что-то еще. Если файл - открыть и обработать, если директория - получить список ее элементов и не только.

Еще есть функция . Она очищает кэш состояния файлов. Если вы производите какие-то изменения в файлах своим скриптом, а потом работаете, основываясь на этих изменениях, то после изменений вызывайте эту функцию. Иначе ваши изменения могут быть не обнаружены. Например, вы пишете в файл, пока его размер не достигнет, скажем, 2Мб. И проверяете размер после каждой записи. И не смотря на то, что файл вырос уже до 2Гб, php по-прежнему видит его первоначальный размер. А вот если вы будете сlearstatcache(), то всё будет нормально.

Давайте рассмотрим небольшой пример: откроем директорию /usr/home/mydir и посмотри что в ней есть.

$dir_hndl = opendir ("/usr/home/mydir" );
while (false !== ($name = readdir ($dir_hndl ))) {
if ($name == ".." ) {
echo "Parent directory
" ;
continue;
} elseif ($name == "." ) {
echo "Current directory
" ;
continue;
}
if (
is_dir ($name )) echo $name . " is a dir
" ;
elseif (is_file ($name )) echo $name . " is a filr" ;
else echo $name . " что же это может быть?
"
;
}
closedir ($dir_hndl );
?>

Теперь я коротко расскажу об остальных.