Меню
Бесплатно
Главная  /  Образование  /  Php проверка директории на наличие файлов. Проверка существования файла на php

Php проверка директории на наличие файлов. Проверка существования файла на php

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

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

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

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

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

Реализация:

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

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

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

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

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

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

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

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

Описание:

bool file_exists (string $filename)

Проверяет наличие указанного файла или каталога.

Список параметров:

Путь к файлу или каталогу.

На платформах Windows, для проверки наличия файлов на сетевых ресурсах, используйте имена, подобные //computername/share/filename или \\computername\share\filename .

Возвращаемые значения:

Возвращает TRUE , если файл или каталог, указанный параметром filename, существует, иначе возвращает FALSE .

Замечание:

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

Внимание!

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

Замечание:

Замечание:

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

Примеры:

Пример #1 Проверка существования файла:

$filename = ‘/path/to/foo.txt’; if (file_exists($filename)) { echo "Файл $filename существует"; } else { echo "Файл $filename не существует"; }

file_exists

(PHP 3, PHP 4, PHP 5)

file_exists — Проверить наличие указанного файла или каталога

Описание

bool file_exists (string filename)

Возвращзает, если файл или каталог с именем, указанным в параметре filename, существует; возвращает в обратном случае.

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

Пример 1. Проверка существования файла

Замечание: Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache() .

Подсказка: Начиная с PHP 5.0.0, эта функция также может быть использована с некоторыми упаковщиками url. Список упаковщиков, поддерживаемых семейством функций stat() , смотрите в Прил. M.

См.также описания функций is_readable() , is_writable() , is_file() и file() .

Смотрите также:
Все функции файл
Описание на ru2.php.net
Описание на php.ru

Вам нужно имя файла в кавычках как минимум (как строка):

Кроме того, убедитесь, что правильно проверен. И тогда он будет работать только тогда, когда активируется в вашей конфигурации PHP

Попробуйте вот так:

Сначала вам нужно понять: у вас нет файлов .
Файл является объектом файловой системы , но вы делаете свой запрос с использованием протокола HTTP, который не поддерживает файлы, кроме URL-адресов.

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

PHP, проверка существования/наличия удаленного файла

если это не 404, вы не можете использовать какие-либо обертки, чтобы увидеть, существует ли файл, и вы должны запросить свой cdn, используя какой-либо другой протокол, например FTP

Вот простейший способ проверить, существует ли файл:

Существует большая разница между и.

php.net/manual/en/function.is-file.php возвращает true для (обычных) файлов:

Возвращает TRUE, если имя файла существует и является обычным файлом, в противном случае FALSE .

возвращает true для обоих файлов и каталогов:

Возвращает TRUE, если существует файл или каталог, указанный по имени файла; FALSE в противном случае.

Примечание. Для получения дополнительной информации по этому вопросу также проверьте этот вопрос с использованием.

вы можете использовать cURL. Вы можете получить cURL только для того, чтобы дать вам заголовки, а не тело, которое могло бы сделать его быстрее. Плохой домен всегда может занять некоторое время, потому что вы будете ждать запроса на тайм-аут; вы, вероятно, можете изменить длину таймаута, используя cURL.

Вот пример:

попробуй это:

читает не только файлы, но и пути. поэтому, когда пуст, команда будет работать так, как если бы она была написана следующим образом:

если каталог / images / существует, функция все равно вернет.

Обычно я пишу это так:

Если вы используете завиток, вы можете попробовать следующий скрипт:

Возвращаемые значения

Возвращает, если файл или каталог, указанный параметром, существует, иначе возвращает.

Замечание :

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

Как в PHP проверить директорию на существование и удалить её?

Замечание :

Проверка происходит с помощью реальных UID/GID, а не эффективных идентификаторов.

Замечание : Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.

Примеры

Пример #1 Проверка существования файла

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня.

  • is_readable() — Определяет существование файла и доступен ли он для чтения
  • is_writable() — Определяет, доступен ли файл для записи
  • is_file() — Определяет, является ли файл обычным файлом
  • file() — Читает содержимое файла и помещает его в массив

Вернуться к: Файловая система

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

В PHP есть два способа проверки директорий на существование. Первый заключается в использовании функции file_exists(). Принцип её работы обсуждался ранее в статье о правах доступа. Напомним, что функция принимает всего один строковой параметр - путь в файловой системе. Несмотря на то, что в названии содержится слово «file» она замечательно работает с директориями.

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

//создадим новую директорию в корне сайта для проверок $dirName = «{$_SERVER[‘DOCUMENT_ROOT’]}/directory»; if (!file_exists($dirName)) { mkdir($dirName); } var_dump(file_exists($dirName)); //Рузультат: bool(true) var_dump(is_dir($dirName)); //Рузультат: bool(true)

Заметка
Функции, отвечающие за проверку директорий на существование, могут возвращать false при отсутствии прав доступа. Такие вещи не зависят от PHP-скрипта, это уровень ответственности операционной системы.

Удаление директории

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

Удаление директории может показаться простой задачей. Однако в большинстве случаев это не так. Функция rmdir() работает только с пустым каталогом и возвращает false, если внутри содержится что-то ещё. В таком случае нужно использовать рекурсивное удаление.

//создадим временную директорию для демонстрации $dirName = «{$_SERVER[‘DOCUMENT_ROOT’]}/directory»; if (!file_exists($dirName)) { mkdir($dirName); } if (rmdir($dirName)) { echo ‘Директория удалена успешно’; } else { echo ‘Невозможно удалить директорию’; }

Рекурсивное удаление

Простого способа удаления заполненной директории не существует.

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

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

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

Мы используем стандартную функцию scandir() для перебора всего содержимого каталога. Если мы натыкаемся на файл, вызываем функцию unlink(), а если на другую директорию, используем её имя для рекурсивного вызова.

//пример функции рекурсивного удаления заданной директории function deleteDirectory($directoryName) { $files = array_diff(scandir($directoryName), [‘.’, ‘..’]); foreach ($files as $file) { if (is_dir(«$directoryName/$file»)) { deleteDirectory(«$directoryName/$file»); } else { unlink(«$directoryName/$file»); } } return rmdir($directoryName); }

Также в PHP есть два встроенных класса RecursiveDirectoryIterator и RecursiveIteratorIterator. Их можно использовать для перебора всех уровней вложенности указанной директории. Обратите внимание, при создании экземпляра класса RecursiveIteratorIterator мы используем второй параметр RecursiveIteratorIterator::CHILD_FIRST. Он заставляет проходить в цикле все файлы и каталоги, начиная от самых вложенных. Таким образом, можно обойтись без явного вызова рекурсивной функции.

//пример функции не использующей рекурсивные вызовы function deleteDirectory($directoryName) { $iterator = new RecursiveDirectoryIterator($directoryName); $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) { if (in_array($file->getFilename(), [‘..’, ‘.’])) { continue; } ($file->isDir()) ? rmdir($file) : unlink($file); } rmdir($directoryName); }

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

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

Проверка существования файла по 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 используется исключительно для хранения системной информации, файлов данных, объектов или динамично формируемых изображений.

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

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

Обязательным параметром для этой функции является 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 "Указанный объект не папка" ;