Инструкции Обзоры  Новости

Php функции работы с файлами и папками. Файловая система PHP

Последнее обновление: 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); // закрываем каталог } } ?>

Вот сразу несколько полезных функций

С файлами можно работать по разному. Например, открыть файл, прочитать/записать, закрыть и т.д. Можно конечно и проще, но об этом чуть ниже.

Для общей информации совсем кратко рассмотрим первый способ

Режимы работы с файлами при открытии.

С помощью функции fopen() мы открываем указанный файл в том или ином режиме:

Открытие и закрытие файлов в php.

В переменную $f в данном случае свалится число, которое будет являться дескриптором данного файла. Т.е. мы будем обращаться к нему через его дескриптор.

Очень маленький пример:

Допустим есть файл в котором написано: 123456789

В примере выше мы открываем файл только для чтения, потом с помощью функции fread() и уже используя дескриптор файла $f а не записывая снова путь целиком, зачитываем сначала первые пять символов, получим: 12345

При этом как и в жизни (когда вы в редакторе работаете с файлами) курсор остался мигать после пятого символа, т.е. между цифрами 5 и 6 - про это надо не забывать.

Функцией fgetss() (с двумя ss) мы зачитаем файл построчно, но без html тегов.

Функцией fgetc() зачитываем файл посимвольно

Запись в файл.

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

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

Прямая работа с файлами.

В последней функции file_put_contents() константа FILE_APPEND, если ее передать третьим параметром, не даст затереть файл новыми данными, а добавит их в конец файла. Об этом нужно не забывать!

Подробный пример прямой работы с файлами можно посмотреть в уроке

Ей необходимо передать два параметра: первый - имя файла (строка), второй - режим (тоже строка). Возвращает функция значение типа Ресурс. В дальнейшем оно будет использоваться другими функциями, работающими с файлами.
Если файл находится в текущей директории, то достаточно указать только его имя (без пути). Если же он находится в другом месте, нужно указать полый путь. Для смены текущей директории используется функция . Ей необходимо сообщить имя каталога, который мы хотим сделать текущим. Если сменить каталог не удастся, функция вернет 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 );
?>

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