Отмена ссылки Php не удаляет файл

Обновлено: 16.05.2024

Вы можете удалить файл с помощью unlink или remove .

При удалении фактически удаляется имя файла. Если это единственное имя файла, то файл также удаляется. Если файл имеет другие оставшиеся имена (см. Жесткие ссылки), он остается доступным под этими именами.

Функция: int разъединить (const char * имя файла)

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

Функция отмены связи удаляет имя файла имя_файла . Если это единственное имя файла, сам файл также удаляется. (На самом деле, если какой-либо процесс имеет открытый файл, удаление откладывается до тех пор, пока все процессы не закроют файл.)

Функция unlink объявлена ​​в заголовочном файле unistd.h.

Эта функция возвращает 0 в случае успешного завершения и -1 в случае ошибки. В дополнение к обычным ошибкам имени файла (см. Ошибки имени файла) для этой функции определены следующие условия ошибки errno:

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

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

Имя удаляемого файла не существует.

В некоторых системах команду unlink нельзя использовать для удаления имени каталога или, по крайней мере, она может использоваться таким образом только привилегированным пользователем. Чтобы избежать таких проблем, используйте rmdir для удаления каталогов. (В системах GNU/Linux и GNU/Hurd unlink никогда не может удалить имя каталога.)

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

Функция: int rmdir (const char * имя файла)

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

Функция rmdir удаляет каталог. Каталог должен быть пуст, прежде чем его можно будет удалить; другими словами, он может содержать только записи для . и...

Во многих других отношениях rmdir ведет себя как unlink . Для rmdir определены два дополнительных условия ошибки errno:

Удаляемый каталог не пуст.

Эти два кода ошибки являются синонимами; некоторые системы используют один, а некоторые используют другой. Системы GNU/Linux и GNU/Hurd всегда используют ENOTEMPTY .

Прототип этой функции объявлен в заголовочном файле unistd.h .

Функция: int удалить (const char * имя файла)

Предварительно: | МТ-Сейф | AS-безопасный | AC-безопасный | См. раздел «Концепции безопасности POSIX».

Это функция ISO C для удаления файла. Он работает как unlink для файлов и как rmdir для каталогов. remove объявлен в stdio.h .

Удаляет имя файла . Подобно функции Unix C unlink(). В случае сбоя будет сгенерирована ошибка уровня E_WARNING.

Параметры

Путь к файлу.

Если файл является символической ссылкой, символическая ссылка будет удалена. В Windows для удаления символической ссылки на каталог необходимо использовать rmdir().

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

Возвращает true в случае успеха или false в случае неудачи.

Журнал изменений

Версия Описание
7.3.0 Вкл. Windows, теперь можно unlink() файлы с используемыми дескрипторами, хотя раньше это не удавалось. Однако по-прежнему невозможно воссоздать несвязанный файл, пока все его дескрипторы не будут закрыты.

Примеры

См. также

Пользовательские заметки 11 заметок

Это приведет к удалению всех файлов в каталоге, соответствующих шаблону в одной строке кода.

('unlink', glob("some/dir/*.txt" )); ?>

Удалили большой файл, но не видите увеличения свободного места или уменьшения использования диска? Используете UNIX или другую ОС POSIX?

Unlink() предназначена не для удаления файла, а для удаления имени файла. В справочной странице сказано: ``unlink - удалить имя и, возможно, файл, на который оно ссылается''.

Большую часть времени файл имеет только одно имя — его удаление также удалит (освободит, освободит) «тело» файла (с одной оговоркой, см. ниже). Это простой, обычный случай.

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

Предупреждение:
Тело файла может *также* быть `поддержано живым' (все еще использующим дисковое пространство) процессом, удерживающим файл открытым. Тело не будет освобождено (не освободит место на диске), пока процесс держит его открытым. На самом деле, есть причудливый способ воскресить файл, удаленный по ошибке, но все еще открытый процессом.

отключить($fileName); не удалось для меня.
Затем я попытался использовать функцию realpath($fileName) как
unlink(realpath($fileName)); это сработало

просто опубликую на случай, если кому-то это покажется полезным.

Вот самый простой способ удалить файлы с маской

= "*.jpg"
array_map ("unlink", glob ($mask));
?>

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

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

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

Поэтому я решил упомянуть об этом здесь, чтобы другие не совершали ту же ошибку:

// Сначала закрываем файл
fclose ( $fp );

// Затем отвязать :)
отключить ( $somefile );
?>

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

foreach ( glob ("*.jpg" ) as $filename ) echo " Размер $filename " . размер файла ($имя_файла). "\п" ;
отключить ( $filename );
>

Это может показаться очевидным, но я рвал на себе волосы из-за этой проблемы — убедитесь, что файл, который вы пытаетесь удалить, в настоящее время не используется. У меня был скрипт, который анализировал текстовый файл и должен был удалить его после завершения, но продолжал получать ошибку отказа в разрешении, потому что я явно не закрыл файл, следовательно, технически он все еще «использовался», хотя анализ был завершено.

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

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

= getcwd (); // Сохраняем текущий каталог
chdir ( $path_to_file );
отключить ( $filename );
chdir ( $old ); // Восстановить старый рабочий каталог
?>

В OSX при борьбе с ошибкой «Отказано в доступе» убедитесь, что у каталога есть разрешения на запись для исполняющего пользователя php.

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

unlink работает так же, как команда rm в nix на основе потерь или команда del в Windows, она не разрешает файл, а удаляет точный указанный путь, даже если этот путь является просто ссылкой.

EG
/var/www/test/index.php = symlink(/home/test/www/index.php)
( "/var/www/test/index.php" ) ;
?>
Будет удалена только ссылка, а не исходный файл, где как
( "/home/test/www/index.php" );
?>
Отключит исходный путь к файлу и разорвет символическую ссылку, а также позволит перезаписать систему, поскольку файловая система больше не будет знать о местонахождении файла.

Лучший способ удалить файлы по маске:
( glob ( '/etc/*' ), 'unlink' );
?>
Не используйте array_map, упомянутый ниже, - его цель - обработать значения в заданном массиве И СОБИРАТЬ данные, возвращаемые функцией обратного вызова. Таким образом, array_map работает медленнее и использует дополнительную память по сравнению с array_walk.

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

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

и код, хранящий путь к изображению, выглядит так

когда я запускаю код, я получаю сообщение об ошибке

Предупреждение: unlink(): нет такого файла или каталога в /home/acmeart/public_html/mercury/upload.php

Я никогда раньше не использовал функцию unlink() и хотел бы, чтобы кто-нибудь, кто использовал ее или знает, как ее использовать, показал мне, что я делаю неправильно.

можете ли вы использовать переменную, чтобы отменить связь с файлом?

  • 3 участника
  • 12 ответов
  • 6 000 просмотров
  • 6 дней для обсуждения
  • Последнее сообщение 13 лет назад Последнее сообщение Кевина Вуда

Рекомендуемые ответы

Конечно, можно.

Ошибка говорит о том, что изображение не существует. Убедитесь, что ваш скрипт находится в том же каталоге, что и изображение, а затем попробуйте добавить «./» в начале имени изображения. А если все не работает, то вы можете попробовать удалить изображение, дающее…

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

может потребоваться установить umask на 0 перед выполнением chmod. 'данные-bs-template='

Все 12 ответов

Конечно, можно.

Ошибка говорит о том, что изображение не существует. Убедитесь, что ваш скрипт находится в том же каталоге, что и изображение, а затем попробуйте добавить «./» в начале имени изображения. И если все не работает, вы можете попробовать удалить изображение, указав полный путь (например, "/home/acmeart/public_html/mercury/image/thumbs/thumb_1.jpg").

Возможно, у вас нет разрешения на удаление файла, но тогда ошибка будет другой.

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

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

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

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

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

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

Короткий способ сделать это:

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

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

или что-то подобное.

может потребоваться установить umask на 0 перед выполнением chmod. 'данные-bs-template='

кстати: chmod принимает имя файла в качестве первого параметра, в моем предыдущем посте было наоборот..

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

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

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

но так как в конце есть .jpg, он не будет работать, если загружен jpg или png. я мог бы исправить это, разрешив загружать только .jpg, но это было бы бесполезно для пользователя.

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

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

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

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

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

но поскольку в конце есть .jpg, он не будет работать, если загружен jpg или png. я мог бы исправить это, разрешив загружать только .jpg, но это было бы бесполезно для пользователя.

есть ли возможность объединения расширений файлов, чтобы он мог выбрать, какое из них ему нужно искать.< /p>

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

Вы можете использовать PHP для вывода HTML для электронной почты. Было бы лучше, если бы вы с самого начала сохранили расширения изображений вместе с изображениями, чтобы вам не приходилось перебирать все возможные расширения каждый раз, когда вы ссылаетесь на изображение.

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

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

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

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

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

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

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

Допустим, ваш адрес электронной почты будет сохранен в строке: $email

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

Я немного изменил код, чтобы он работал так, как мне нужно, но он не отображает изображения на странице. возможно я перепутал код. если вы видите проблему, укажите это.

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

Теперь я удалил нижнюю половину кода и переместил часть его в верхнюю часть кода. теперь это выглядит так:

однако код по-прежнему не работает.

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

PHP

В этой статье мы покажем, как удалить файл с помощью PHP.

Удаление файлов может потребоваться по многим причинам.

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

Так как же это делается с помощью PHP?

В PHP есть функция unlink(), которая позволяет нам удалить файл.

Итак, PHP-код для удаления файла показан ниже.

Итак, приведенный выше код очень прост. Это одна строка.

Функция PHP delete() принимает один параметр.

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

Итак, это все, что требуется для удаления файла.

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

Приведенный ниже PHP-код удаляет файл и предоставляет нам дополнительную информацию.

Этот код теперь более прямолинеен. Это говорит нам больше.

Сначала мы смотрим, существует ли файл. Если файл существует, код переходит к следующей строке. В этой строке мы создаем переменную с именем $deleted. Эта переменная содержит результат функции разъединения PHP. Если файл был успешно удален, переменная $deleted будет содержать значение 1 или TRUE. Если это не так, переменная $deleted будет содержать значение 0 или FALSE. Если файл успешно удален, выводится строка «Файл успешно удален». Если нет, выводится строка "Файл не был успешно удален".

Если файл не существует, выводится строка "Исходный файл, который вы хотите удалить, не существует".

Итак, приведенный выше код говорит нам обо всем. Он сообщает нам, существует ли файл, который мы хотим удалить. И он сообщает нам, было ли удаление файла успешным или нет.

И это все, что требуется для удаления файла с помощью PHP.

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

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

Скажем, у вас есть список файлов, в которых есть слово "HTML4", например "Как создать горизонтальную линию с помощью HTML4", "Как создать абзац". -using-HTML4" и "How-to-create-an-anchor-tag-using-HTML4", и вы обновили себя до всего HTML5 и решили удалить все файлы с HTML4.

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

В этом прелесть PHP-функции unlink().

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

Так как же пройтись по всем файлам в каталоге и удалить нужные файлы?

Итак, этот код выполняет поиск в каталоге статей. Конечно, вы можете указать любой каталог на своем веб-сайте.

Код PHP проверяет, является ли это каталогом. Если это так, он открывает каталог. Цикл while перебирает все файлы в каталоге.

Затем мы пишем оператор if, чтобы узнать, содержит ли каждый файл фразу "HTML4". Если это так, мы удаляем файл с помощью функции PHP unlink().

Читайте также: