Php существует ли файл. Как проверить существование файла на PHP

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

Я тоже при разработке модуля столкнулся с этим вопросом. И нашел два варианта решения поставленной задачи.

Проверка существования файла по URL-ссылке

В PHP существует функция «fopen », с помощью которой можно открыть указанный URL.

Что мы делаем? Пытаемся открыть файл, и если нам это удается, значит, файл существует, а противном же случае – файла нет.

Реализация:

А что, если мы имеем не один файл, а несколько, так сказать, массив ссылок? Эта задача как раз и стояла изначально передо мной. И решение уже такой задачи следующее:

В этом случае мы получаем список только тех файлов, которые существуют.

Проверка существования локального файла

Под словом «локальный» подразумевается, что скрипт и файлы для проверки находятся на одном сервере. Если у вас довольно большой массив ссылок – этот вариант самый лучший для решения задачи, так как мы делаем не запрос на сторонний сервер, а сканирование указанных директорий.

В этом способе используется функция «file_exists», и по аналогии с предыдущим вариантом просто заменяется часть скрипта:

И то же самое для массива ссылок:

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

Кстати говоря, делая один из заказов, именно этим способом мне удалось просканировать порядка 135 000 файлов всего за пару секунд.

Обязательным параметром для этой функции является pathname, где задается путь к создаваемой директории.

mkdir("newfolder" );

При таком указании папки, она будет создана в той же директории, из которой был запущен php-скрипт. Если нужно создать каталог в другом месте, можно задать относительный путь к создаваемой папке или указать полный путь от корневой директории сайта.

mkdir("../newfolder" ); // на уровень ниже

mkdir("/folder1/folder2/newfolder" ); // полный путь

В последнем примере обязательным условием будет существование подкаталогов "folder1" и "folder2". Если их не будет, функция, в таком виде не сможет выполнить создание папки и вернет ошибку:

Warning: mkdir() : No such file or directory in …

В случае удачного выполнения, функция возвращает значение True. Если пака не была создана, возвращается значение False.

if (mkdir("newfolder" ))
echo "Папка успешно создана" ;
else
echo "Папка не создана" ;

Но не стоит использовать эту функцию без проверки на наличие папки, так как ошибку о том, что не удалось создать папку, сервер все равно будет выводить.

Назначение прав при создании папки

За назначение прав на создаваемую папку отвечает второй необязательный параметр функции mkdir . По умолчанию, назначаются максимальные привилегии – 0777.

Права назначаются восьмеричным значением с обязательным нулем на первом месте. Не считая первого нуля, числа означают уровни доступа для владельца, для группы владельца, для всех остальных.

0 – доступ закрыт;

1 – доступ для чтения;

2 – доступ на запись;

4 – доступ на выполнение.

Чаще всего права задаются составной суммой, например:

7 – полный доступ (1+2+4);

5 – чтение и выполнение (1+4).

mkdir("newfolder" , 0777); // полный доступ для всех

Создание нескольких вложенных поддиректорий

Создать несколько вложенных папок сразу можно, просто задав еще один необязательный логический параметр – recursive.

mkdir("folder1/folder2/newfolder" , 0777, True ); // полный доступ для всех

В этом случае, если папок "folder1" и "folder2" нет, функция создаст и их, и папку "newfolder". Сообщений об ошибках, если других проблем не возникнет, выведено не будет и функция вернет значение True.

Удаление папки

Пустую папку в PHP можно удалить функцией rmdir . В параметре dirname для нее так же задается полный или относительный путь к удаляемому каталогу:

rmdir("myfolder" );

rmdir("folder1/folder2/myfolder" );

В каждом из указанных случаев удаляется только папка "myfolder". Если папки нет или путь задан некорректно, будет выведена ошибка:

Warning: rmdir(myfolder) : No such file or directory in …

Удаление непустой папки

Удаления непустого каталога выполняется путем последовательного удаления вложенных файлов в папке функцией unlink , а затем удаление пустой папки функцией rmdir . Для этого можно использовать подобную функцию:

function my_delete_dir($mypath){
$dir = opendir($mypath);
while (($file = readdir($dir))){
if (is_file($mypath."/" .$file))
unlink ($mypath."/" .$file);
elseif (is_dir($mypath."/" .$file) && ($file != "." ) && ($file != ".." ))
my_delete_dir ($mypath."/" .$file);
}
closedir ($dir);
rmdir ($mypath);
}

my_delete_dir("myfolder" ); // вызов функции

Проверка существования каталога

Перед большинством операций с каталогами стоит проверять, существуют ли они. Для этого применяется функция file_exists .

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

if (file_exists("myfolder" ))
echo "Указанная папка существует" ;
else
echo "Указанной папки нет" ;

if (is_dir("myfolder" ))
echo "Указанный объект папка" ;
else
echo "Указанный объект не папка" ;

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

Я тоже при разработке модуля столкнулся с этим вопросом. И нашел два варианта решения поставленной задачи.

Проверка существования файла по URL-ссылке

В PHP существует функция «fopen », с помощью которой можно открыть указанный URL.

Что мы делаем? Пытаемся открыть файл, и если нам это удается, значит, файл существует, а противном же случае – файла нет.

Реализация:

А что, если мы имеем не один файл, а несколько, так сказать, массив ссылок? Эта задача как раз и стояла изначально передо мной. И решение уже такой задачи следующее:

В этом случае мы получаем список только тех файлов, которые существуют.

Проверка существования локального файла

Под словом «локальный» подразумевается, что скрипт и файлы для проверки находятся на одном сервере. Если у вас довольно большой массив ссылок – этот вариант самый лучший для решения задачи, так как мы делаем не запрос на сторонний сервер, а сканирование указанных директорий.

В этом способе используется функция «file_exists», и по аналогии с предыдущим вариантом просто заменяется часть скрипта:

И то же самое для массива ссылок:

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

Кстати говоря, делая один из заказов, именно этим способом мне удалось просканировать порядка 135 000 файлов всего за пару секунд.

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

Алгоритмы проверки наличия файла позволяют избежать ошибок при исполнении кода. Функция PHP file_exists предлагает простое решение для проверки существования файла или каталога.

Синтаксис и использование функции file_exists

Результат функции - true или false. Единственный параметр - имя файла и путь к нему. Результат функции кэшируется потому, если PHP file_exists не работает, а файл на самом деле существует, то это ошибка алгоритма.

При использовании функции clearstatcache() можно избежать многих ошибок в исследовании состояния доступной файловой системы. Но следует иметь в виду, что на несуществующем файле PHP file_exists будет выдавать false до тех пор, пока искомый файл не будет создан, а затем будет выдавать true даже когда он был уже удален.

Корректное сочетание функции clearstatcache() и функций, связанных с файловой системой (например, is_writable(), is_readable(), is_executable(), is_file(), is_dir() и других), позволяет избежать «скрытых» ошибок исполнения скриптов.

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

Параметр функции PHP file_exists

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

Документация декларирует, что при проверке PHP ориентируется на UID/GID, а не на эффективные идентификаторы. Разрабатывая алгоритм использования PHP file_exists, следует обратить внимание не только на правильные слэши (прямой или обратный), кодировку пути к файлу и имя самого файла, но и проверить наличие нужного регистра, правильных символов, прав доступа и других обстоятельств.

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

Применение функции на практике

Области применения скриптов PHP существенно отличаются. Нельзя сказать, что PHP file_exists используется исключительно для хранения системной информации, файлов данных, объектов или динамично формируемых изображений.

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

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



Понравилась статья? Поделиться с друзьями: