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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Работа с файлами

Необходимость в операциях с файлами встает перед программистом очень часто. Если ваши скрипты не используют баз данных, то файлы остаются единственными приемлемыми хранителями информации для скрипта. Применение файлов как хранилищ информации выполнения скрипта позволяет использовать их в самых разнообразных ситуациях. Практически все скрипты-счетчики чего-либо написаны на основании работы с файлами. Также возможно привести кучу других примеров, но пора переходить непосредственно от слов к делу.

Сразу хочу сказать, что работа с файлом должна быть санкционирована. По умолчанию PHP не допускает работу с файлом в целях безопасности. Чтобы снять этот запрет в FTP-менеджере CuteFTP в свойствах файла выставьте все галочки, в других менеджерах должно быть что-то подобное.

file_exists

Прежде, чем производить операции с файлом, часто необходимо убедиться, что указанный файл вообще существует. Этим и занимается функция file_exists . Эта функция может возвращать только два значения, как вы сами понимаете, TRUE (если указанный файл существует) и FALSE . Обычно использование данной функции выглядит так:

Заметьте, что функция действует только на локальных файлах, то есть если вы возжелаете проверить, обзавелся ли Яндекс файлом robot.txt, то ваши усилия будут тщетны. Но зато возможно проверить любой файл, лежащий на локальном сервере независимо от директории его расположения.

Вот некоторые правила описания пути к файлу.

filesize

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

file

Эта функция уже непосредственно работает с файлом. Она возвращает содержимое указанного файла, причем делает она это в виде массива, где каждый его элемент является строкой файла. Функция полезна, когда в одном файле необходимо сохранить несколько разных значений, которые не должны пересекаться. Тогда каждое значение сохраняется на отдельной строке и читается функцией file , которая возвращает массив, вследствие чего обращение к заданной переменной происходит с помощью чтения значения элемента массива с индексом, соответствующим строке в файле.

Кроме того, возможно воссоединение всех элементов возвращенного массива в одну переменную. Это делается с помощью функции работы с массивами implode .

fopen

Если предыдущая функция самодостаточна и в общем не связана с другими функциями, то последующие функции работы с файлами работают в связке с fopen . Эта функция открывает указанный файл и возвращает идентификатор соединения с файлом, который используется в служебных целях. С содержимым файла эта функция никаким образом не связывается.

Функция fopen имеет несколько режимов работы с файлом. Они указываются после имени файла и представляют из себя следующие обозначения:

    "r"
    Файл открывается только для чтения его содержимого.

    "r+"
    Открытие файла как для чтения, так и для записи.

    "w"
    Файл открывается с целью записи.

    "w+"
    Открыть файл для чтения и записи.

    "a"
    Файл открывается для записи в конец файла (дозаписи).

    "a+"
    Открывается для дозаписи и чтения.

fgets

Функция чтения файла, открытого функцией fopen . Но в отличие от file , эта функция за каждый раз своего выполнения возвращает только одну строку файла, при этом она перемещает внутренний указатель файла на следующую строку, которую она прочитает при следующем обращении к функции. Поэтому, если вам необходимо прочитать файл целиком, необходимо использовать эту функцию в цикле.

Заметьте, что функция fgets использует дополнительный параметр length , который указывает максимальную длину строки файла для чтения. Если объем строки превышает это число, то функция возратит ее в "урезанном" виде объемом в число length байт. По умолчанию этот параметр установлен в 1024 байт, или в один килобайт. Тем более обратите внимание на этот параметр, если вы используете файлы больших размеров, так как при чтении таких файлов может переполниться буфер выполнения PHP (его объем указывается в файле конфигурации), что приведет к зависанию.

Обратите внимание, что в качестве указания файла для чтения необходимо указывать не имя файла, а идентификатор соединения с файлом, возвращенный функцией fopen (в нашем примере это значение переменной $file).

fputs

Функция записи информации в файл, причем делает она это по принципу работы функции fgets , то есть начинает запись с позиции внутреннего файлового указателя. Вообще, эта функции во многом схожа с вышеуказанной: она также использует параметр длины записываемых данных, который также является опциональным.

fclose

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

Для иллюстрации связки вышеуказанных функций приведем пример создания простого счетчика посещений.

$file = fopen("counter.txt", "r");
$c = fgets ($file, 150);
fclose ($file);
$c++;
$file = fopen("counter.txt", "w");
fputs ($file, $c);
fclose ($file);
echo $c;
?>

Работа с директориями

Тесно связаны с действиями над файлами операции с директориями. Алгоритм работы с ними схож с операциями над файлами: сначала директорию необходимо открыть, выполнить какие-либо действия и, наконец, закрыть ее.

opendir

Эта функция открывает указанную директорию и возвращает служебный идентификатор соединения с директорией. Пути к директории следует указывать следующим образом:

Точка означает открытие текущей директории

. /files/

Открытие папки files , находящейся в текущей директории

Открытие папки на уровень выше текущей

readdir

Функция читает директорию, открытую opendir . За каждый проход она возвращает имя файла или папки, лежащих в указанной директории, и перемещает внутренний указатель на следующий объект директории. Так что для прочтения всей директории ее необходимо использовать в цикле.

Также необходимо заметить, что эта функция возвращает служебные объекты папки . и .. , которые можно отсекать при выводе оператором IF .

closedir

Закрываем директорию, указывая в качестве аргумента идентификатор соединения с папкой.

Иногда использование функций работы с директориями очень облегчают жизнь. Например, в разделе Функции вы можете видеть список функций в алфавитном порядке. Представляете, сколько времени нужно было бы потратить, чтобы вручную написать весь этот список с ссылками, да еще и в алфавитном порядке. И вот как раз здесь мне помогли функции работы с директорией. Каждая функция была помещена в отдельный файл с именем, соответствующим названию функции, без каких-либо расширений.

Так что, при каждом заходе на страницу вы получаете только что сгенерированный список функций.

На этом все. Встретимся на следующем уроке.

Мы с Вами уже . И теперь я решил затронуть тему работы с каталогами в 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() не сработает . Вот как решить эту проблему Вы узнаете в следующей статье, поэтому подписывайтесь на обновления, чтобы не пропустить её появление.