如果文件存在PHP

3
我使用以下代码从FTP中删除旧图像...
unlink(getcwd() . '/images/' . $row['pic']);

但是如果没有图片,它会抛出错误,所以我尝试使用file_exists(),但也没有起作用,那么在尝试删除之前如何检查是否有图片呢。谢谢。

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

展示你使用 file_exists 的代码。 - Pekka
5个回答

3
通常主机提供商会为ftp和apache使用不同的用户…这可能是因为你没有对图像进行chmod,导致www用户无法删除它们?
编辑:
也许is_writable对你来说是更好的解决方案:
if(is_writable(dirname(__FILE__) . '/images/pics/' . $row['pic'])){
  unlink(dirname(__FILE__) . '/images/pics/' . $row['pic']); 
}

只有当存在图像时,它才会删除图像,但如果没有任何图像,则会抛出错误,因此我想在删除之前使用任何函数来检查图像是否存在。 - seoppc
为什么我应该使用 is_writeable 而不是 getcwd() - seoppc
你是指使用dirname()而不是getcwd()吗?这并没有太大的区别...但你真的应该使用is_writable而不是file_exists,它会检查文件是否存在,同时也会检查你是否有足够的权限来修改它。 - Flask

3

首先,您可以将图像路径存储在$path变量中。然后,您可以测试图像是否存在且可写,并仅在满足条件时删除它。

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

如果您正在使用PHP 5,并想了解可能抛出的任何异常信息,可以将整个表达式用try...catch语句包围起来。
try{
    $path = getcwd() . '/images/pics/';
    if( file_exists( $path . $row['pic'] ) && is_writable( $path . $row['pic'] ) ){
      unlink( $path . $row['pic'] ); 
    }
} catch (Exception $exc) {
    echo $exc->getMessage();
    echo $exc->getTraceAsString();
}

这可能不会解决问题,但可以帮助澄清其发生原因。


3

首先检查getcwd()返回什么。可能是false,这意味着您没有设置正确的权限。因此,您的路径构建不正确。检查getcwd()文档,更改权限或联系系统管理员。还要尝试使用dirname(__FILE__)


使用 getcwd,如果有图像,则可以成功删除它,但是如果没有图像,则会抛出错误。 - seoppc
请提供错误信息。如果您使用var_dump()函数输出构建的路径,它会显示什么? - usoban

1

我也遇到了同样的问题。我允许用户上传最多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);
}

这很好地运行了,没有出现任何错误。希望能对你有所帮助 :)

-4
尝试在unlink(getcwd() . '/images/' . $row['pic']);前面添加@符号。
@unlink(getcwd() . '/images/' . $row['pic']);
如果有文件,它将被删除,如果没有,您将不会收到错误消息。

@usoban 如果这是由于竞态条件引起的,那么这将是唯一的方法。请展示一个更好的方法。 - Pekka
@usoban,你能解释一下为什么在这种情况下抑制错误是非常糟糕的吗? - meouw
2
因为压制错误永远不是解决方案。也许你在生产环境中会遇到其他错误,至少要将其记录在某个地方,而不是压制它。问题显然出在权限上。 - usoban
我同意usoban的观点,你绝不能执行任何你不确定能够正常工作的代码。即使看起来像是无害的操作,比如抑制unlink函数。 - Wesley van Opdorp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接