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
);
?>
Теперь я коротко расскажу об остальных.