web-dev-qa-db-de.com

PHP unlink () behandelt die Ausnahme

Nun, ich habe mich gefragt, ob ich mit der Funktion unlink() richtig umgehen kann. Ich möchte nicht, dass die Funktion unlink() einen unangenehmen Fehler auslöst, wenn die Verknüpfung der Datei nicht aufgehoben werden kann (weil die Datei nicht gefunden wurde).

Ich habe so etwas ausprobiert

try { 
    unlink("secret/secret.txt"); 
} catch(Exception $e) { 
    print "whoops!"; 
    //or even leaving it empty so nothing is displayed
} 

Aber es funktioniert nicht. Ich bin kein PHP-Experte. Ich habe diesen Ausnahmebehandlungscode irgendwo im Web gesucht und gefunden. Aber da ich mich an meine Schulzeit erinnern kann, wurde dasselbe für Java verwendet. SO es hätte funktionieren sollen. Ich weiß nicht, was mit dem Code falsch ist.

Oder kann ich einfach eine if..else-Anweisung verwenden

if(unlink($file)){
  //leaving here empty must ensure that nothing is displayed
}else{
  //leaving here empty must ensure that nothing is displayed
}

Aber dieser Code funktioniert auch nicht. Wo mache ich den Fehler? Was sind die anderen Möglichkeiten, richtig damit umzugehen?

Können die Fehler durch Manipulation mit der Fehlerberichterstattung (PHP) (Produktions- und Entwicklungsumgebung) ausgeblendet werden?

19
prakashchhetri

unlink löst keine Ausnahmen aus und generiert Fehler. Der richtige Weg, dies zu tun, ist zu prüfen, ob die Datei existiert, bevor versucht wird, unlink aufzurufen. Wenn Sie lediglich befürchten, dass die Fehler nicht ausgegeben werden, sollten Sie display_errors deaktivieren, was Sie in einer Produktionsumgebung sowieso immer tun sollten. Dann werden sie einfach protokolliert.

Unterdrücken Sie keine Fehler mit dem @, der selten empfohlen wird.

Können Sie mehr über @ beschreiben?

Ich bin nicht sicher, was du genau meinst. Aber die Dokumentation ist hier . Was ist der Grund, warum Sie es nicht verwenden wollen ... Das ist, weil Sie nie wissen, dass Code nicht funktioniert oder problematisch ist. Selbst wenn der Code aus einer funktionalen Perspektive noch funktioniert, hat er immer noch ein Problem und dieses Problem könnte möglicherweise dazu führen, dass irgendetwas völlig anderes nicht funktioniert. Wenn Sie den Fehler nie haben, verschwenden Sie wahrscheinlich viel Zeit mit dem Debuggen. 

Sie können den Protokollierungsgrad ändern oder die Anzeige von Fehlern deaktivieren, aber Sie möchten sie niemals vollständig unterdrücken.

18
prodigitalson

Wenn Sie nur den Fehler unterdrücken möchten, können Sie Folgendes tun:

@unlink('your_file_name');

Im Allgemeinen unterdrückt @ in php jeden Fehler.

Der bessere Weg ist, die Fehlerwahrscheinlichkeit zu minimieren. Sie haben gesagt, dass eine Fehlermöglichkeit durch eine nicht vorhandene Datei verursacht wird. Wenn ich du wäre, mache ich das:

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

Viel Glück :)

22
goFrendiAsgard

Diese Methode mag seltsam erscheinen, aber ich glaube, es ist die narrensicherste

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
}

Warum? 

Zuerst ist is_file die richtige Methode, um zu prüfen, ob eine DATEI existiert. File_exists . file_exists sucht sowohl nach Verzeichnissen als auch nach Dateien, sodass die TRUE für ein Verzeichnis mit zurückgegeben werden kann Wenn Sie denselben Dateinamen verwenden, können Sie ein Verzeichnis nicht mit unlink entfernen. Dadurch wird ein Fehler ausgegeben. 

Überprüfen Sie, ob eine Datei vorhanden ist ( is_file ), bevor Sie unlink die beste Methode zum Löschen einer Datei sind. 

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

Es ist jedoch keine narrensichere Methode, da in dem kleinen Fenster zwischen der is_file - Prüfung und der unlink - Datei häufig eine Datei gelöscht wird. Ich habe dies mehrmals erlebt, wenn eine Caching-Methode das Dateisystem verwendet.

Aber es ist die beste verfügbare Methode. 

So können Sie alles richtig machen und trotzdem einen Fehler bekommen!

Nun, zumindest sagt Ihnen der Fehler, ob er fehlschlägt. Tatsächlich können Sie feststellen, ob er ohne Fehler ausfällt 

unlink

Gibt TRUE bei Erfolg oder FALSE bei Fehler zurück.

Wenn Sie es richtig codiert haben und zwischen Erfolg und Misserfolg unterscheiden können, dann unlink JA unterdrücken den Fehler, nützt es Ihnen oder Ihrem Code nicht. 

Ob der Fehler unterdrückt wird oder nicht, Dies ist die beste Methode, die ich mir vorstellen kann, um ihn zu verhindern. Durch die Verkürzung der Zeit zwischen Prüfung und Löschung verringern Sie die Wahrscheinlichkeit, dass ein Fehler ausgelöst wird. 

BEARBEITEN: aktualisierte Link-URLs

11
TarranJones

Mit is_writable können Sie testen, ob Sie über die erforderlichen Berechtigungen zum Ändern oder Löschen einer Datei verfügen.

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

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

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

Behandlung des Fehlers "Ressource nicht verfügbar" durch unlink () als Ausnahme mit try catch

Selbst wenn is_file() oder file_exists() prüfen, ob eine Datei existiert oder nicht, besteht die Möglichkeit, dass die Datei von einigen Anwendungen verwendet wird, die das Löschen verhindern, und unlink() zeigt "Ressource nicht verfügbar" error an.

Nachdem ich viele Methoden ausprobiert hatte: is_resource(), is_writable(), stream_get_meta_data()... usw., habe ich den einzig besten Weg gefunden, Fehler zu behandeln, während "Löschen" einer Datei existiert, die entweder nicht existiert oder existiert aber von einer Anwendung verwendet werden

function delete_file($pFilename)
{
    if ( file_exists($pFilename) ) { 
        //  Added by [email protected]
        //  '@' 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;
}

=== VERWENDUNG ===

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

Verwenden Sie 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;
    }
0
maximark

Meine Erfahrung sagt, dass der Aufruf von file_exists () kurz vor dem Aufruf von unlink () doNICHTwork ist, auch wenn clearstatcache () kurz vor dem Aufruf von file_exists ( ) .

Es gibt viele Kombinationen von PHP -Versionen und Betriebssystemen, und die einzige Möglichkeit, die ich gefunden habe, die immer funktioniert (dh das Anzeigen der Warnmeldung im Fehlerfall), besteht darin, meine eigene Funktion silent_unlink zu erstellen () :

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

Es deaktiviert die Fehlermeldung für Warnungen nur für den Aufruf von unlink () und stellt den vorherigen error_reporting () - Status wieder her.

0
VCorrea