Php функции работы с файлами и папками. Управление файлами и каталогами. Операции с каталогами
Мы с Вами уже . И теперь я решил затронуть тему работы с каталогами в PHP . В этой статье Вы научитесь создавать каталоги в PHP , удалять их и считывать из них файлы и подкаталоги.
Начнём с самого простого: создание каталога в PHP :
mkdir("new_dir");
?>
После запуска этого скрипта у Вас будет создан пустой каталог "new_dir ".
Удалить пустой каталог очень просто. Для этого используется функция rmdir() .
rmdir("new_dir");
?>
А вот теперь перейдём к работе с содержимым каталогов через PHP . Здесь есть очень простые правила, которые необходимо соблюдать. Все эти правила очень логичны, и Вы их применяете, когда вручную просматриваете содержимое каталогов:
- Открыть каталог.
- Считать содержимое.
- Закрыть каталог.
Чтобы не мучить Вас в ожиданиях, сразу приведу код, который выводит имена файлов и категорий внутри заданного каталога:
$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
);
?>
Теперь я коротко расскажу об остальных.