Работа с файловой системой в PHP
Основные функции работы с файловой системой можно разделить на следующие категории:
· функции работы с каталогами (папками);
· функции доступа к общей информации о файле и файловой системе;
· функции операций над файлом;
· функции ввода/вывода;
· функции работы с временными файлами.
В качестве разделителя имен в полном имени каталога или файла в Windows можно использовать как символ обратного слеша "\", так и обычного слеша – "/".
Функции работы с каталогами позволяют:
· создавать и удалять каталоги;
· выделить каталог в полном пути к файлу;
· определить имя текущего каталога;
· изменить текущий каталог;
· выполнить проверки для каталога;
· получить доступ к содержимому каталога.
Для создания и удаления каталога используются функции mkdir() и rmdir().
Функция
bool mkdir(string dirname)
создает каталог с указанным именем dirname. Если каталог создан, функция возвращает значение true или, в противном случае, значение false.
Функция
bool rmdir(string dirname)
удаляет указанный каталог dirname (каталог должен быть пустым и иметь права на удаление). Если удаление каталога завершается успешно, функция возвращает true, иначе – false.
Для определения имени каталога в полном имени файла используется функция
string dirname(string path)
Она возвращает имя каталога из полного имени файла path.
Определить имя текущего каталога можно с помощью функции
string getcwd()
В случае ошибки эта функция возвращает значение false.
Для изменения текущего каталога используется функция
bool chdir(string dirname)
Эта функция выполняет переход из текущего каталога в каталог dirname, который становится текущим каталогом. Если переход в каталог direname завершается успешно, возвращается значение true, иначе – false.
Выполнить проверки для каталога можно с помощью функций is_dir() и file_exists().
Функция
bool is_dir(string name)
возвращает true, если параметр name является именем каталога и false – в противном случае.
Функция
bool file_exists(string name)
возвращает true, если файл или каталог с именем name существует и false – в противном случае.
Пример 4.6.132. Использование функций dirname(), getcwd(), chdir() и file_exists():
В результате выполнения этого фрагмента программы
// Определение имени каталога
// для файла "Введение.doc"
$newDirName = dirname("d:/Uploads/Введение.doc");
// Если каталог $newDirName существует
if(file_exists($newDirName))
{
// Вывод имени текущего каталога
print "Current directory: ".getcwd();
// Переход в каталог $newDirName
chdir($newDirName);
// Вывод имени нового текущего каталога
print "\nNew current directory: ".getcwd();
}
будут выведены следующие строки:
Для получения доступа к содержимому каталога можно использовать функции opendir(), readdir(), rewinddir() и closedir(), а также функцию scandir().
Функция
int opendir(string dirname)
возвращает дескриптор (целое число) указанного в параметре dirname каталога. Данный дескриптор используется в функциях readdir(), rewinddir(), closedir(). Если указанный каталог доступен – возвращается значение дескриптора, иначе – false.
Функция
string readdir(int dir_handle)
возвращает имя очередного элемента каталога (файла или каталога) с дескриптором dir_handle и сдвигает внутренний указатель к следующему элементу (после открытия каталога функцией opendir() внутренний указатель устанавливается на первый элемент каталога). Если каталог не содержит больше элементов, возвращается значение false.
Функция
void rewinddir(int dir_handle)
устанавливает внутренний указатель каталога с дескриптором dir_handle в начало для повторного обхода элементов функцией readdir().
Функция
void closedir(int dir_handle)
освобождает каталог с дескриптором dir_handle, открытый до этого функцией opendir().
Пример 4.6.133. Использование функций opendir(), readdir() и closedir(), а также функции is_dir():
Следующий фрагмент программы выводит для заданного каталога имена содержащихся в нем элементов и их типы:
// Задание имени каталога
$UploadsDir = "d:/Uploads/";
// Открытие каталога
$UploadsDirHandle = opendir($UploadsDir);
// Вывод заголовка
print "Directory \"$UploadsDir\" content:";
// Вывод имен и типов элементов каталога в цикле
for(;;)
{
// Получение имени текущего элемента
$elementName = readdir($UploadsDirHandle);
// Если элементов больше нет
if($elementName === false)
// Выход из цикла
break;
// Вывод имени и типа текущего элемента
echo "\nElement: $elementName Type: ",
is_dir($UploadsDir.$elementName)?"Directory":"File";
}
Вывод этого фрагмента имеет следующий вид (символом "." обозначается текущий каталог, а символами ".." – родительский каталог):
Функция
array scandir(string dirname, [int sorting_order])
возвращает массив имен файлов и каталогов, содержащихся в каталоге dirname. Параметр sorting_order задает режим сортировки выводимых имен. Если значение этого параметра равно 0 (это значение по умолчанию), то имена файлов выводятся в алфавитном порядке. Если же задано ненулевое значение параметра sorting_order, то имена файлов выводятся в порядке, обратном алфавитному.
Пример 4.6.134. Использование функции scandir():
Следующий фрагмент программы выводит для заданного каталога имена содержащихся в нем элементов (в порядке, обратном алфавитному) и их типы, а также, для каталогов, количество содержащихся в них элементов:
// Задание имени каталога
$UploadsDir = "d:/Uploads/";
// Сканирование каталога
$UploadsArray = scandir($UploadsDir, 1);
// Вывод заголовка
print "Directory \"$UploadsDir\" content:";
// Вывод имен и типов элементов каталога
// "Uploads" в цикле
for($i=0; $i < count($UploadsArray); $i++)
{
// Получение имени текущего элемента
$elementName = $UploadsArray[$i];
// Вывод имени текущего элемента
echo "\n", $i+1, ". $elementName Type: ";
// Получение типа текущего элемента
$elementType =
is_dir($UploadsDir.$elementName);
// Если элемент - каталог
if($elementType)
{
// Получение и вывод типа элемента
// и количества файлов в каталоге
$CurrentDirArray =
count(scandir($UploadsDir.$elementName));
print "Directory Files number: $CurrentDirArray";
}
else
// Вывод типа текущего элемента
echo "File";
}
Вывод этого фрагмента имеет следующий вид (символом "." обозначается текущий каталог, а символами ".." – родительский каталог):