2011-04-08 6 views
1

J'essaie de vérifier si un fichier existe et si c'est le cas, supprimez-le. Pour une raison étrange, vérifier le fichier retourne vrai, mais il ne sera pas dissocier pour la vie de moi. Voici le code que j'ai.Le fichier existe mais ne sera pas UNLINK (PHP)

if(file_exists(TEMPLATEPATH.'/uploads/'.$_POST['image_name'])) { 
     if (@unlink(TEMPLATEPATH.'/uploads/'.$_POST['image_name'])) { 
      echo "true"; 
     } else { 
      echo "false"; 
     } 
    } else { 
     echo "false"; 
    } 

note * --- sans @ il n'y a pas d'erreur ... * note2 --- ceci est sous windows localhost w/pile WAMP et avant de dire c'est pourquoi cela ne fonctionne pas, je confirme qu'un autre site utilisant la même syntaxe fonctionne pour eux sans aucune autorisation spéciale.

Merci pour l'aide!

+4

Un problème de permission? –

+7

Aussi pour une raison étrange les gens ne publient pas d'erreurs ... Oh, attendez ... Vous supprimez l'erreur en utilisant @. Retirez-le, vous serez éclairé. – acm

+0

En général, il est bon de ne PAS utiliser le suppresseur d'erreur @! – markus

Répondre

4

Ok je suis un crétin et a découvert que le nom de la variable affichée a changé et aurait dû être « image » au lieu de « image_name » ....

Désolé pour vous perdre les gars ' temps!

11

Même si le fichier existe, cela ne signifie pas que vous disposez des autorisations pour le supprimer.

Vous devriez remove the @ operator, ce qui met fin à une erreur potentielle - ce qui est probablement très intéressant.


Et si vous ne voulez pas les messages d'erreur à afficher à l'utilisateur, vous devez:

+0

Ah vous me battre à l'édition suggérant d'enlever le @ pour obtenir des erreurs cachées out :) Vous êtes la réponse à celui! –

+0

J'ai mis à jour la question - sans @ ne fait aucune différence et n'obtient aucun message ... –

+1

Dans ce cas, assurez-vous que error_reporting est configuré pour signaler les avertissements et les erreurs; vous pouvez utiliser 'error_reporting (E_ALL);' au début de votre script - et que ceux-ci soient enregistrés ou affichés (vous pouvez utiliser 'ini_set ('display_errors', 'on');' au début de votre script) . –

0

@Rick: Si vous prenez la suppression d'avertissement @, PHP ne renvoyaient un accès s refusé message d'erreur? Si oui, c'est le problème. Essayez

if (file_exists(TEMPLATEPATH . '/uploads/' . $_POST['image_name'])) { 
    chmod(TEMPLATEPATH.'/uploads/'.$_POST['image_name']), 0755); 

    if (unlink(TEMPLATEPATH . '/uploads/' . $_POST['image_name'])) { 
     echo "true"; 
    } else { 
     echo "false"; 
    } 
} else { 
    echo "false"; 
} 
0

Comme d'autres le disent, vous devez disposer des autorisations appropriées à supprimer. Plus précisément, vous avez besoin d'une autorisation d'écriture. Essayez ceci:

$filename = TEMPLATEPATH.'/uploads/'.$_POST['image_name']; 
if(is_writable($filename)) { 
    unlink($filename) 
} else { 
    // error handling. You can check which condition is failing here 
} 
+0

J'ai utilisé is_writable et suis revenu vrai. –

+0

Vous n'avez besoin que de 'si (is_writable ($ filename))' 'is_writable()' et 'is_readable()' ont implicitement 'file_exists()' car ils retournent false si le fichier n'existe pas ou n'est pas accessible en écriture/lisibilité (selon la fonction utilisée), et tous les trois font également une notification de niveau d'avertissement en cas d'échec. – Phoenix

+0

@Phoenix: Vous avez absolument raison. J'ai été troublé parce que quelqu'un m'a déjà dit de faire cette vérification, mais en y pensant maintenant, ils parlaient de 'is_file' plutôt que de' file_exists' car 'file_exists' s'applique aussi aux répertoires. Je viens de l'avoir un peu en arrière ici. Merci. – AgentConundrum