если файл существует php

#php

#php

Вопрос:

Я использую следующий код для удаления старого изображения с ftp…

 unlink(getcwd() . '/images/' . $row['pic']);
  

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

 if(file_exists(getcwd() . '/images/pics/' . $row['pic'])) 
{ 
   unlink(getcwd() . '/images/pics/' . $row['pic']);
}
  

Комментарии:

1. Покажите код, который вы пробовали с file_exists

Ответ №1:

часто хостеры используют разных пользователей для ftp и apache… может быть, у вас нет chmodded ваших изображений, поэтому www-пользователь не может их удалить?

Редактировать:

возможно, is_writable — лучшее решение для вас:

 if(is_writable(dirname(__FILE__) . '/images/pics/' . $row['pic'])){
  unlink(dirname(__FILE__) . '/images/pics/' . $row['pic']); 
}
  

Комментарии:

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

2. почему я должен использовать is_writeable вместо getcwd() ?

3. вы имеете в виду dirname() вместо getcwd()? не имеет большого значения.. но вам действительно следует использовать is_writable вместо file_exists, он проверяет, существует ли файл, но также проверяет, достаточно ли у вас прав для его изменения.

Ответ №2:

Сначала проверьте, что возвращает getcwd(). Вероятно, false, так что это означает, что у вас неправильно установлены разрешения. Следовательно, ваш путь построен неправильно. Проверьте документы getcwd(), измените разрешения или обратитесь к системному администратору. Также взгляните на dirname(__FILE__)

Комментарии:

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

2. пожалуйста, предоставьте информацию об ошибке. Если вы используете var_dump() сконструированный путь, что он говорит?

Ответ №3:

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

 $path = getcwd() . '/images/pics/';
if( file_exists( $path . $row['pic'] ) amp;amp; is_writable( $path . $row['pic'] ) ){
  unlink( $path . $row['pic'] ); 
}
  

Если вы используете PHP 5 и хотите узнать больше о любом исключении, которое может быть вызвано, тем временем вы можете окружить все выражение try...catch оператором:

 try{
    $path = getcwd() . '/images/pics/';
    if( file_exists( $path . $row['pic'] ) amp;amp; is_writable( $path . $row['pic'] ) ){
      unlink( $path . $row['pic'] ); 
    }
} catch (Exception $exc) {
    echo $exc->getMessage();
    echo $exc->getTraceAsString();
}
  

Вероятно, это не решит проблему, но может помочь прояснить, почему это происходит.

Ответ №4:

У меня была такая же проблема. Я разрешил пользователю загружать ДО 8 изображений. Но, допустим, они загрузили только четыре… Затем удалил пост. У меня возникла ошибка для остальных четырех изображений, потому что они не существовали. Итак, это то, что я сделал…

 $GetImages = "SELECT * FROM sales_images WHERE ID = $imgID";

$GotImages = $conn->query($GetImages);

    while($pic = $GotImages->fetch_assoc())
{
    $path = '../images/sales/';
    $img1 = $pic['img1'];
    $img2 = $pic['img2'];
    $img3 = $pic['img3'];
    $img4 = $pic['img4'];
    $img5 = $pic['img5'];
    $img6 = $pic['img6'];
    $img7 = $pic['img7'];
    $img8 = $pic['img8'];
}


if (!empty($img1)) {
unlink($path . $img1);
}
if (!empty($img2)) {
unlink($path . $img2);
}
if (!empty($img3)) {
unlink($path . $img3);
}
if (!empty($img4)) {
unlink($path . $img4);
}
if (!empty($img5)) {
unlink($path . $img5);
}
if (!empty($img6)) {
unlink($path . $img6);
}
if (!empty($img7)) {
unlink($path . $img7);
}
if (!empty($img8)) {
unlink($path . $img8);
}
  

Это отлично сработало и не выдало ошибок. Надеюсь, это поможет 🙂

Ответ №5:

Попробуйте добавить @ перед unlink(getcwd() . ‘/images/’ . $row[‘pic’]);

@unlink(getcwd() . ‘/images/’ . $row[‘pic’]);

Если файл существует, он будет удален, а если его нет, вы не получите сообщение об ошибке.

Комментарии:

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

2. @usoban Можете ли вы объяснить, почему подавление ошибки в этом случае настолько плохо?

3. Потому что подавление ошибок НИКОГДА не является решением. Возможно, вы получите какую-то другую ошибку в рабочей среде, по крайней мере, зарегистрируйте ее где-нибудь, а не подавляйте. Проблема явно в разрешениях.

4. Я согласен с usoban, вы никогда не должны выполнять что-либо, в работе чего вы не уверены на 100%. Даже если это выглядит безобидно, как превышение unlink.