Как удалить файл php который не удаляется. Как удалить файл в PHP

Как удалить файл php который не удаляется. Как удалить файл в PHP
Как удалить файл php который не удаляется. Как удалить файл в PHP

Продолжаем урок, который посвящен теме «Работа с файлами PHP ». Если вы не читали предыдущий , рекомендую почитать, а те, кто читал, двигаемся дальше. В этом уроке вы научитесь удалять созданный или существующий файл с помощью PHP, копировать или переименовывать, блокировать файл.
Ну что, если вы готовы, тогда в бой…

Удаление файла на PHP

Если вам нужно удалить какой-либо файл, воспользуйтесь PHP-функцией unlink() :

Unlink(имя_файла);

Имя_файла – здесь укажите имя файла, который нужно удалить.

Припустим, нам нужно удалить файл «file.txt », пример для заполнения будет вот такой:

Unlink("file.txt");

Готовый код:

Если файл «file.txt » присутствовал, скрипт его удален.

Копирование файла на PHP

Если вам нужно из одного файла перекопировать содержимое в другой файл, воспользуйтесь PHP-функцией copy() .

Copy("файл1", "файл2");

Файл1 – имя файла откуда будет копироваться текст
- файл2 – имя файла куда будет копироваться текст

Для примера создайте на локальном сервере в папке «test-1 » файл под названием «file2.txt ». Пусть файл будет пустым. Теперь вставим этот код copy("file.txt", "file2.txt"); в php код «file.php »:

Что мы сделали? Создали через PHP файл под названием «file.txt », сделали запись в файле «file.txt » через PHP « Я рад видеть вас на блоге сайт », вывели результат в браузере, скопировали текст с файла «file.txt » и вставили в файл «file2.txt ». Не верите, что так все произошло? Вы помните, что файл «file2.txt » был пустым?! Откройте его! И что вы видите? Да, правильно, текст, который был в файле «file.txt »:

Переименование файла на PHP

Чтобы сделать переименование файла, воспользуйтесь PHP-функцией rename() :

Rename("файл1", "файл2");

Файл1 – название файла, которое нужно заменить (переименовать )
- файл2 – здесь нужно дать новое название файла

Пример для заполнения вот такой:

Rename("file2..txt");

Вот готовый код:

Файл «file2.txt » переименован в файл «сайт.txt ».

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

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

Этот совет поможет вам узнать, как удалить файл в PHP при помощи функции unlink .

Пошаговая инструкция:

Для удаления файла в PHP можно использовать функцию unlink . На примере простого скрипта, разберем работу unlink :

  1. Создайте текстовый файл в текстовом редакторе (vi/vim, nano, gedit или просто в стандартном Блокноте).
  2. Наберите или просто скопируйте в него следующий код: $file="example.log";
    unlink($file);
    ?>
  3. Сохраните (к примеру под именем testunlink.php) и разместите созданный файл скрипта на вашем тестовом web-сервере. В этом же каталоге создайте файл example.log с любым содержимым. Именно его мы и будем удалять.
  4. Запустите скрипт, вызвав его в браузере, и, посмотрев вновь в каталог, вы обнаружите, что файла example.log там больше нет. Unlink сделал свое дело!

Как это все работает:

Первая строка кода скрипта: определяем тип нашего скрипта.

Вторая строка кода: После запуска созданного нами скрипта, переменной file будет присвоено значение example.log (обратите внимание, что файл с одноименным названием должен присутствовать в том же каталоге, что и созданный нами скрипт. Просто создайте его с любым содержимым!).

Третья строка кода: Удаляем файл example.log, передав его в качестве аргумента функции unlink.

Четвертая строка кода скрипта: конец кода php.

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

PHP функция unlink()

А начну я с php-функции unlink() , которая и осуществляет удаление файла:

bool unlink (string $filename [, resource $context ])

Здесь $filename - путь к файлу, а $context (не обязательно) - описание контекстов для работы с потоками (поддерживается в PHP, начиная с 5.0.0) . Функция возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Пример использования php-функции unlink():

$filename = "./path/to/file.txt";

Почему эта функция называется unlink()?

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

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

В Windows такого нет и функция unlink() удаляет именно файл. Более того, некоторые версии PHP для Windows вообще не поддерживают unlink() . В таком случае используется команда del через system() или exec() , например:

$filename = "/2014/04/file.txt";
if (isset($_ENV["WINDIR"])) {
@exec("del ". $filename);
if (file_exists($filename)) die("Error Delete File.");
} else if (!(@unlink($filename))) {
die("Error Delete File.");
}

В данном случае переменная среды $_ENV["WINDIR"] может служить маркером использования Windows-платформы, а проверка выполнения удаления файла осуществляется через php-функцию file_exists() , которая осуществляет проверку существования файла.

Как удалить файл(ы) в PHP?

В некоторых случаях может получиться и так, что функция unlink() не будет иметь доступа к удалению файла, т.е. получаем ошибку : permission denied . Это может быть связано с неправильно указанным путём к файлу или отсутствием прав доступа.

Интересным вариантом для работы с путями к файлу является использование php-функций getcwd() (получает имя текущего рабочего каталога) и chdir() (изменяет текущий каталог на указанный) , например:

$file_path = "path/to";
$file_name = "/2014/04/file.txt";
$old = getcwd();
if (!(@chdir($file_path))) die("Error open path.");
if (!(@unlink($file_name))) die("Error Delete File.");
chdir($old);

Как вы видите, так в чём-то проще ориентироваться и отследить проблему. В тоже время, будет не лишним, после выполнения удаления вернуться в текущий каталог $old .

Что же до проблем доступа, то здесь можно попробовать использовать php-функцию chmod() (изменяет режим доступа к файлу) , например:

$filename = "/2014/04/path/to/file.txt";
@chmod($filename, 0666);
if (!(@unlink($filename))) die("Error Delete File.");

Если Вам необходимо удалить все файлы в директории удобно использовать комбинацию из php-функций array_map() (применяет callback-функцию ко всем элементам массива) и glob() (находит файловые пути, совпадающие с шаблоном) , например:

array_map("unlink", glob("some/dir/*.txt"));

Решение проблемы многопоточности при удалении файлов

Гораздо сложнее, когда речь заходит о крупных сайтах, где велико количество одновременных запросов (потоков) к скрипту. Здесь существует ряд решений. Я же приведу лишь одно из них, основное на использовании семафоров .

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

Для получения ресурса семафора используется функция sem_get() . Функцией можно получить семафор со значением, отличающимся от единицы, и тогда захватить семафор смогут несколько потоков. Для захвата используется функция sem_acquire() . Пример:

$sem = sem_get(1);
if (sem_acquire($sem) && file_exists($filename)) @unlink($filename);
sem_remove($sem);

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

Важную роль здесь играет функция sem_remove() , которая отпускает занятый семафора. Если семафор не отпустить, то параллельный поток останется в состоянии ожидания вплоть до окончания работы текущего. Поэтому функция и должна быть вне условия.

На этом у меня всё. Надеюсь, что моя статья была Вам полезна или просто познавательно. Спасибо за внимание. Удачи!

в 8:00 Изменить сообщение

Нередко, при создании программы, возникает необходимость удаления файлов (причины могут быть самыми разными) и в этом случае нам на помощь приходит unlink php. Сегодня мы научимся удалять файлы в PHP и рассмотрим несколько примеров.

Удаляем файлы при помощи unlink PHP

Для удаления файлов служит функция unlink() . Синтаксис у этой функции следующий:

unlink (имя_файла)

Данная функция является логической и поэтому в случае успешного удаления файла возвращает TRUE, а в случае неудачи – FALSE. Рассмотрим использование unlink() на примере:

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

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

Удалять файлы в PHP при помощи unlink совсем не сложно, как говорится, ломать — не строить. В следующий раз мы научимся проверять состояние файлов.

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

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

Несмотря на кажущуюся сложность алгоритма, реализация очень простая и прозрачная:

function removeDirectory($dir) {
if ($objs = glob($dir."/*")) {
foreach($objs as $obj) {
is_dir($obj) ? removeDirectory($obj) : unlink($obj);
}
}
rmdir($dir);
}
?>

Постараюсь объяснить понятным языком алгоритм работы данной функции. Первым делом мы получаем список всех файлов внутри заданной директории. Если их там нет, то сразу удаляем её. Если они есть, то начинаем по-очереди перебирать. Если элемент является файлом, то просто удаляем его (unlink($obj) ). Если же это каталог, то вызываем вновь нашу функцию, передав этот каталог. Это и есть рекурсия: функция вызывает сама себя . После вызова функцией самой себя всё начинается заново, но уже с другой директорией. У ней также удаляются все файлы, а все её директории отправляются вновь в эту функцию. Когда все директории и файлы удалены, у нас удаляется уже пустой каталог.

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