Немного о компьютере

Unlink php — удаление файлов. Как удалить файл в PHP Как удалить файл php

8 years ago

Deleted a large file but seeing no increase in free space or decrease of disk usage? Using UNIX or other POSIX OS?

The unlink() is not about removing file, it"s about removing a file name. The manpage says: ``unlink - delete a name and possibly the file it refers to"".

Most of the time a file has just one name -- removing it will also remove (free, deallocate) the `body" of file (with one caveat, see below). That"s the simple, usual case.

However, it"s perfectly fine for a file to have several names (see the link() function), in the same or different directories. All the names will refer to the file body and `keep it alive", so to say. Only when all the names are removed, the body of file actually is freed.

The caveat:
A file"s body may *also* be `kept alive" (still using diskspace) by a process holding the file open. The body will not be deallocated (will not free disk space) as long as the process holds it open. In fact, there"s a fancy way of resurrecting a file removed by a mistake but still held open by a process...

10 years ago

I have been working on some little tryout where a backup file was created before modifying the main textfile. Then when an error is thrown, the main file will be deleted (unlinked) and the backup file is returned instead.

Though, I have been breaking my head for about an hour on why I couldn"t get my persmissions right to unlink the main file.

Finally I knew what was wrong: because I was working on the file and hadn"t yet closed the file, it was still in use and ofcourse couldn"t be deleted:)

So I thought of mentoining this here, to avoid others of making the same mistake:

// First close the file
fclose ($fp );

// Then unlink:)
unlink ($somefile );
?>

14 years ago

To delete all files of a particular extension, or infact, delete all with wildcard, a much simplar way is to use the glob function. Say I wanted to delete all jpgs .........

Foreach (glob ("*.jpg" ) as $filename ) {
echo " $filename size " . filesize ($filename ) . "\n" ;
unlink ($filename );
}

?>

10 years ago

To anyone who"s had a problem with the permissions denied error, it"s sometimes caused when you try to delete a file that"s in a folder higher in the hierarchy to your working directory (i.e. when trying to delete a path that starts with "../").

So to work around this problem, you can use chdir() to change the working directory to the folder where the file you want to unlink is located.

$old = getcwd (); // Save the current directory
chdir ($path_to_file );
unlink ($filename );
chdir ($old ); // Restore the old working directory
?>

4 years ago

On OSX, when fighting against a "Permission Denied" error, make sure, the directory has WRITE permissions for the executing php-user.

Furthermore, if you rely on ACLs, and want to delete a file or symlink, the containing directory needs to have "delete_child" permission in order to unlink things inside. If you only grant "delete" to the folder that will allow you to delete the container folder itself, but not the objects inside.

4 years ago

This might seem obvious, but I was tearing my hair out with this problem - make sure the file you"re trying to delete isn"t currently being used. I had a script that was parsing a text file and was supposed to delete it after completing, but kept getting a permission denied error because I hadn"t explicitly closed the file, hence it was technically still being "used" even though the parsing was complete.

11 years ago

Ggarciaa"s post above has already one small error, closedir has to be used even if $DeleteMe is false











}

Closedir ($dh );
if ($DeleteMe ){
@ rmdir ($dir );
}
}

?>

9 months ago

Handling "Resource Unavailable" error by unlink() as Exception using try catch

Even is_file() or file_exists() will check for file is exists or not, there are chances that file is being used by some applications that will prevent deletion and unlink() will display "Resource Unavailable" error.

So after trying many methods like: `is_resource()`, `is_writable()`, `stream_get_meta_data()`...etc, I reached the only best way to handle error while *"deleting"* a file that is either **not exists** or **is exists but being used by some application**

function delete_file($pFilename)
{
if (file_exists($pFilename)) {
// Added by muhammad.begawala
// "@" will stop displaying "Resource Unavailable" error because of file is open some where.
// "unlink($pFilename) !== true" will check if file is deleted successfully.
// Throwing exception so that we can handle error easily instead of displaying to users.
if(@unlink($pFilename) !== true)
throw new Exception("Could not delete file: " . $pFilename . " Please close all applications that are using it.");
}
return true;
}

/* === USAGE === */

try {
if(delete_file("hello_world.xlsx") === true)
echo "File Deleted";
}
catch (Exception $e) {
echo $e->getMessage(); // will print Exception message defined above.
}

11 years ago

Ggarciaa"s post above has one small error, it will ignore file and directory strings that are evaluated as false (ie. "0")

Fixed code is below (false !==)

// ggarciaa at gmail dot com (04-July-2007 01:57)
// I needed to empty a directory, but keeping it
// so I slightly modified the contribution from
// stefano at takys dot it (28-Dec-2005 11:57)
// A short but powerfull recursive function
// that works also if the dirs contain hidden files
// $dir = the target directory
// $DeleteMe = if true delete also $dir, if false leave it alone

Function SureRemoveDir ($dir , $DeleteMe ) {
if(! $dh = @ opendir ($dir )) return;
while (false !== ($obj = readdir ($dh ))) {
if($obj == "." || $obj == ".." ) continue;
if (!@ unlink ($dir . "/" . $obj )) SureRemoveDir ($dir . "/" . $obj , true );
}
if ($DeleteMe ){
closedir ($dh );
@ rmdir ($dir );
}
}

//SureRemoveDir("EmptyMe", false);
//SureRemoveDir("RemoveMe", true);

?>

8 years ago

Unlink can fail after using ODBC commands on the file (on Windows).

Neither nor did the trick.

Only released the file such that it could be deleted afterwards ...

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

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

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

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

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

Я Вам скажу так, данный алгоритм не столько полезен с точки зрения практики (не так часто приходится удалять каталоги с файлами в 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 Изменить сообщение

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.

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

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

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

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

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

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

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

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

Похожие публикации