PHP unlink () обработка исключения

Ну, мне было интересно, смогу ли я справиться с

7 ответов


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

не подавлять ошибки с @, его редко целесообразно.

можете ли вы быть более описательным о @

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

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


Если вы хотите только surpress ошибку, вы можете сделать это:

@unlink('your_file_name');

Как правило, в php @ будет обрабатывать любую ошибку.

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

if(file_exists('your_file_name')){
    unlink('your_file_name');
}else{
    echo 'file not found';
}

удачи :)


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

if(is_file($file) && @unlink($file)){
    // delete success
} else if (is_file ($file)) {
    // unlink failed.
    // you would have got an error if it wasn't suppressed
} else {
  // file doesn't exist
}

почему?

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

Проверка наличия файла (is_file) до unlink это правильный / лучший способ удалить файл.

if(is_file($file) && unlink($file)){

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

но это лучший способ.

так вы можете сделать все правильно и все равно получить ошибку!

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

unlink

возвращает TRUE или FALSE на провал.

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

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

EDIT: обновленные URL-адреса ссылок


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

http://php.net/manual/en/function.is-writable.php

try {
  if(!is_writable($file))
      throw new Exception('File not writable');

  unlink($file);
}
catch(Exception $e) { /* do what you want */ }

обработка ошибки "ресурс недоступен" по unlink() в качестве исключения с помощью try catch

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

Итак, попробовав много методов, таких как:is_resource(), is_writable(), stream_get_meta_data()...etc, я достиг единственного лучшего способа справиться с ошибкой, пока "удаление" файл, который является либо не существует или существует, но используется некоторым приложением

function delete_file($pFilename)
{
    if ( file_exists($pFilename) ) { 
        //  Added by muhammad.begawala@gmail.com
        //  '@' 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;
}

=== использование ===

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

Использовать PHP_Exceptionizer https://github.com/DmitryKoterov/php_exceptionizer/blob/master/lib/PHP/Exceptionizer.php

$exceptionizer = new PHP_Exceptionizer(E_ALL);
try {
        unlink($file)
    }  catch (E_WARNING $e) {
        return false;
    }

мой опыт говорит, что вызов file_exists () просто перед вызовом unlink () тут не, даже если clearstatcache() был вызван непосредственно перед вызовом file_exists ().

Есть много комбинации версий PHP и операционных систем, и единственный способ, который я нашел, который всегда работает (то есть избегает показывать предупреждающее сообщение в случае ошибки) сделать мои собственные функции silent_unlink():

function silent_unlink( $filename )
{
  $old_er = error_reporting();
  error_reporting( $old_er & ~E_WARNING );
  $result = unlink( $filename );
  error_reporting( $old_er );
  return $result;
}

он отключает сообщение об ошибках предупреждений только для вызова unlink () и восстанавливает предыдущие предназначенных() статус.