unlink — Удаляет файл


(PHP 3, PHP 4, PHP 5)

unlink — Удаляет файл

Удаляет файл filename . Функция похожа на функцию unlink() Unix C. Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Замечание: Начиная с версии PHP 5.0.0, функция unlink() также может быть использована с некоторыми обвёртками URL.

Замечание: Аргумент context был добавлен начиная с версии PHP 5.0.0.

2 RMcLeod [2010-04-10 13:01:00]

Я создаю файл SQL, помещая этот файл в zip файл с некоторыми изображениями, а затем удаляя файл SQL с помощью unink.Strange, он также удаляет zip файл.

2 ответа

2 Решение Dan Soap [2010-04-10 13:25:00]

jared at kippage dot com 03-Sep-2009 01:08

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

Если вы добавляете файлы в zip файл, который вы хотите удалить, убедитесь, что вы удалили ПОСЛЕ того, как вы вызываете close().

Если файлы, добавленные в объект недоступны за время сохранения zip файл не будет создан.

Простое решение: добавьте $zip->close() , прежде чем вы вызовете unlink($sqlFileName); , и все будет в порядке.

unlink() никогда не удаляет более одного файла. Ваш zip файл не создается в первую очередь, потому что вы не закрываете архив, который в основном говорит PHP, чтобы он обернул заголовки архива, выполнил сжатие и т.д. Добавьте $zip->close() в свой код.

UPDATE Я просто прочитал, что ZipArchive:: close() вызывается автоматически в конце script, поэтому это оставляет только два варианта: либо ваш вызов zip->open() завершается с ошибкой. или ваш код не входит в цикл foreach, оставляя вас с пустым архивом. Пустые архивы не создаются в соответствии с комментарий в функции doc.

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

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

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

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

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

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


$filename = ‘./path/to/file.txt’;
if ( !(@unlink($filename)) ) die(‘Error Delete File.’);

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

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

Илон Маск рекомендует:  Вёрстка для новичков в HTML Academy

В 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() не будет иметь доступа к удалению файла, т.е. получаем ошибку [function.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() (находит файловые пути, совпадающие с шаблоном) , например:

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

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

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

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

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

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

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

Никто ещё не оставил комментариев, станьте первым.

int unlink(const char *pathname);
#include /* определения констант of AT_* */
#include
int unlinkat(int dirfd, const char *pathname, int flags);


Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

Начиная с glibc 2.10: _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE

ОПИСАНИЕ

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

Если имя указывает на символьную ссылку, то будет удалена ссылка.

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

unlinkat()

Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в unlink() и rmdir(2)).

Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как unlink() и rmdir(2)).

Если в pathname задан абсолютный путь, то dirfd игнорируется.

Аргумент flags представляет собой битовую маску, значение которой может быть 0, или объединённым значением флагов с помощью OR, определяющих операцию unlinkat(). В настоящее время определён только один флаг:

Илон Маск рекомендует:  Как в Word объединить таблицы

AT_REMOVEDIR По умолчанию, unlinkat() выполняет действие, эквивалентное unlink() с параметром pathname. Если указан флаг AT_REMOVEDIR, то выполняется действие, эквивалентное rmdir(2) с параметром pathname.

Смотрите в openat(2) объяснение необходимости unlinkat().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

ОШИБКИ

В unlinkat() могут возникнуть те же ошибки, что и в unlink() и rmdir(2). Также, в unlinkat() могут возникнуть следующие ошибки:

EBADF dirfd не является правильным файловым дескриптором. EINVAL В flags указано неверное значение флага. EISDIR Значение pathname ссылается на каталог и в flags не указан AT_REMOVEDIR. ENOTDIR Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.

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

Сначала я создаю каталог, который будет содержать файлы. И я создаю его так: mkdir($filepath, 0777, true);

Часть с созданием файла работает просто отлично. Вернуться на страницу удаления, я пытаюсь сделать это так: unlink(«PROOT. ‘files’. DS. $dir. DS. $settings->name»);

И PROOT является корнем файла, так как я занимаюсь объектно-ориентированным программированием и делаю это из соображений безопасности, а также DS является разделителем.

vardump параметра из ссылки будет выглядеть следующим образом /framework/files/4/peep(2).jpg а ссылка на файл будет выглядеть следующим образом http://localhost/framework/files/4/peep(2).jpg и я на 100% уверен, что нет проблем с PROOT или DS .

Есть две проблемы.

Во-первых, у вас есть кавычки вокруг конкатенации, которая делает все буквальным, кроме $dir и $settings->name .


Во-вторых, переменная, которую вы должны использовать для корня, это $_SERVER[‘DOCUMENT_ROOT’] , а не PROOT .

�� Как удалить символические ссылки в Linux

У вас может быть появиться задача создать или удалить символические ссылки в Linux.

Если да, знаете ли вы, как это сделать?

Вы уже сделали это? Вы знаете об этом что-либо?

Если да, то проблем нет. Если нет, не волнуйтесь, мы здесь, чтобы помочь вам в этом.

Это можно сделать с помощью команд rm и unlink.

Что такое символическая ссылка?

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

Это похоже чем-то на ярлык в Windows.

Она может указывать на файл или каталог в той же или другой файловой системе или разделе.

Обычно символические ссылки используются для связи библиотек.

Также они используются для связывания файлов журналов и папок на смонтированных общих папках NFS (Network File System).

Что за команда rm?

Команда unlink используется для удаления указанного файла.

Она уже установлена, так как является частью GNU Gorutils.

1) Как удалить файлы символьных ссылок с помощью команды rm

Команда rm является одной из наиболее часто используемых команд в Linux.

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

В этой статье мы покажем вам, как удалить файл в системах GNU/Linux с помощью команды unlink.

unlink утилита командной строки для удаления одного файла

Синтаксис команды unlink следующий:


Где filename имя файла, который вы хотите удалить. В случае успеха команда не выдает никаких результатов и возвращает ноль.

Команда unlink принимает только две опции, –help, которая отображает справку команды и –version информацию о версии.

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

В отличие от более мощной команды rm, unlink может принимать только один аргумент, что означает, что вы можете удалить только один файл. Если вы попытаетесь удалить более одного файла, вы получите ошибку «unlink: extra operand».

При удалении символических ссылок с помощью unlink файл, на который указывает символическая ссылка, не удаляется.
Чтобы удалить данный файл, вам необходимо иметь права на запись в каталог, содержащий этот файл. В противном случае вы получите ошибку «Operation not permitted».

Например, если вы попытаетесь удалить файл file3.txt в с помощью unlink /opt, который принадлежит root:

Илон Маск рекомендует:  Что такое код lseek

Система напечатает следующее сообщение:

В системах GNU/Linux никогда не удаляйте каталог с помощью unlink. Если вы попытаетесь удалить каталог:

Вы получите следующее сообщение:

Заключение

Удаление файлов с помощью unlink простого процесса, но вы должны быть осторожны, чтобы не удалить соответствующие данные.

2 RMcLeod [2010-04-10 13:01:00]

Я создаю файл SQL, помещая этот файл в zip файл с некоторыми изображениями, а затем удаляя файл SQL с помощью unink.Strange, он также удаляет zip файл.

2 ответа

2 Решение Dan Soap [2010-04-10 13:25:00]

jared at kippage dot com 03-Sep-2009 01:08

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

Если вы добавляете файлы в zip файл, который вы хотите удалить, убедитесь, что вы удалили ПОСЛЕ того, как вы вызываете close().

Если файлы, добавленные в объект недоступны за время сохранения zip файл не будет создан.

Простое решение: добавьте $zip->close() , прежде чем вы вызовете unlink($sqlFileName); , и все будет в порядке.

unlink() никогда не удаляет более одного файла. Ваш zip файл не создается в первую очередь, потому что вы не закрываете архив, который в основном говорит PHP, чтобы он обернул заголовки архива, выполнил сжатие и т.д. Добавьте $zip->close() в свой код.

UPDATE Я просто прочитал, что ZipArchive:: close() вызывается автоматически в конце script, поэтому это оставляет только два варианта: либо ваш вызов zip->open() завершается с ошибкой. или ваш код не входит в цикл foreach, оставляя вас с пустым архивом. Пустые архивы не создаются в соответствии с комментарий в функции doc.

Эта тема обсуждалась много раз, но она не исправила мою ошибку . Когда я пытаюсь использовать функцию unlink ($ path), она просто выдает мне ошибку, однако у меня есть разрешения на ее удаление, файл и путь верны Я просто не вижу ошибки.


Вот мой код (deleteuser.php):

PS Я очень новичок в PHP, постараюсь объяснить это как можно больше для новичков! Спасибо!

Вы /thnk.php абсолютный путь, и я очень сомневаюсь, что вы поместили файл в /thnk.php , а не в корневой каталог документа.

Корень документа вашего веб-сервера и ваши файлы php находятся здесь:

Когда вы пишете unlink(‘/thnk.php’); это будет выглядеть здесь:

Но вы хотите удалить файл отсюда:

Это другой «корень». Итак, вы должны написать

Или используйте относительный путь как

Если вы не знаете ошибку, но что-то не работает, всегда полезно просто включить отчет об ошибках:

Я разочарован удалением файла в ubuntu, используя PHP unlink ().

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

  • запускать другой скрипт, когда установлен флажок
  • PHP + S3: разрешение отклонено при удалении файла с помощью unlink ()
  • Невозможно отменить файл в Codeigniter
  • Как избежать рисков безопасности UNLINK в PHP?
  • разрешено отклонение — php unlink
  1. создайте папку с именем «files» ниже / var / www с разрешением 766.
  2. загрузите файл, скажем, «image.png» в этой папке и установите разрешение на 666
  3. создать файл php с именем delete.php, установить разрешение на 644 и загрузить в каталог / var / www
  4. Вызовите файл в браузере (я использую localhost)

«Image.png» по-прежнему существует в каталоге «файлы»

Вот сценарий php для файла delete.php:

Я также попробовал следующий скрипт:

Но все равно не удается удалить файл.

Папка / владелец каталога может отличаться от пользователя, используемого для запуска php.

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

Один пользователь не может удалять файлы другого пользователя в системе unix. Если вы установите его на 777, вы можете удалить его …

Unlink выдает предупреждение об ошибке. Проверьте, видимо ли E_WARNING для вас, чтобы узнать, что происходит.

Обычно это сводится к правам пользователей. Имейте в виду, если ваш сценарий выполняется браузером, обычно пользователь с именем wwwrun или wwwdata (или что-то подобное) выполняет его на вашем сервере.

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

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL