40

unlink()さて、私はその機能を適切に処理できるかどうか疑問に思っていました。unlink()ファイルのリンクを解除できない場合(ファイルが見つからないことが原因である可能性があります)、関数が厄介なエラーをスローすることは望ましくありません。

私は次のようなことを試みました

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

しかし、それは機能していません。私はPHPの専門家ではありません。この例外処理コードを検索して、Webのどこかで見つけました。しかし、学生時代を思い出すことができるので、同じことがJavaにも使用されました。だからそれはうまくいくはずだった。コードのどこが悪いのかわかりません。

または、次のようなif..elseステートメントを使用できますか?

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

しかし、このコードも機能していません。私はどこで間違いをしているのですか?それを適切に処理する他の方法は何ですか?

エラー報告(PHP)(本番環境および開発環境)で操作することにより、エラーを隠すことができますか?

4

8 に答える 8

42

注:これはおそらくもう機能しません。ブライアンのコメントを見る

エラーのみを抑制したい場合は、次のようにすることができます。

@unlink('your_file_name');

一般に、PHPでは、@はエラーを抑制します。

より良い方法は、エラーの可能性を最小限に抑えることです。エラーの可能性の1つは、存在しないファイルが原因であるとあなたは言いました。私があなたなら、私はこれをします:

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

幸運を :)

于 2013-03-10T02:30:25.367 に答える
27

unlink例外をスローせず、エラーを生成します。これを行う適切な方法は、ファイルを呼び出す前にファイルが存在することを確認するunlinkことです。エラーが出力されないことだけを心配している場合は、オフdisplay_errorsにする必要があります。これは、とにかく本番環境で常に行う必要があります。その後、ログに記録されます。

でエラーを抑制しないでください@。めったにお勧めできません。

あなたはについてもっと説明できますか@

正確に何を意味するのかわかりません。しかし、ドキュメントはここにあります。なぜそれを使いたくないのかというと...それは、コードが機能していない、または問題があることを決して知らないからです。コードが機能的な観点から機能している場合でも、問題が発生しているため、ある時点で他の何かが完全に機能しなくなる可能性があります。エラーが発生しない場合は、デバッグに多くの時間を浪費する可能性があります。

ログレベルを変更したり、エラーの表示を無効にしたりすることは問題ありませんが、エラーを完全に抑制したくはありません。

于 2013-03-10T02:32:21.953 に答える
22

この方法は奇妙に思えるかもしれませんが、「競合状態」を説明する最も確実な方法だと思います。

is_file

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が存在するかどうかを確認するための正しいメソッドです。 file_existsはディレクトリとファイルの両方をチェックするため、同じファイル名のディレクトリを返す可能性があります。リンクTRUEを解除してディレクトリを削除することはできず、エラーが発生します。

リンクを解除する前にファイルが存在することを確認する(is_file)のが、ファイルを削除する正しい/最良の方法です。

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

ただし、is_fileチェックとunlinkの間の小さなウィンドウでファイルが削除されるのは一般的であるため、これは絶対確実な方法ではありません。キャッシング方法がファイルシステムを使用するとき、私はこれを数回経験しました。

しかし、それは利用可能な最良の方法です。

したがって、すべてを正しく実行してもエラーが発生する可能性があります。

まあ、少なくともエラーはそれが失敗したかどうかを教えてくれます....まあ実際にはエラーなしで失敗したかどうかを知ることができます

リンクを解除

TRUE成功またはFALSE失敗時に戻ります。

あなたがそれを正しくコーディングし、成功と失敗したリンク解除を区別できるなら、YESはエラーを抑制します、それはあなたやあなたのコードに利益をもたらしません。

エラーが抑制されているかどうかにかかわらず、これはエラーが発生しないようにするために私が考えることができる最良の方法です。チェックから削除までの時間を短縮することで、エラーがスローされる可能性を減らすことができます。

編集:更新されたリンクURL

于 2015-11-25T09:59:02.300 に答える
6

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 */ }
于 2016-04-22T23:05:08.427 に答える
4

私の経験では、file_exists()を呼び出す直前にclearstatcache()が呼び出された場合でも、unlink()を呼び出す直前に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()を呼び出すだけで警告のエラー報告を無効にし、以前のerror_reporting()ステータスを復元します。

于 2018-07-31T15:21:43.323 に答える
2

try catchを使用した例外としてunlink()による「ResourceUnavailable」エラーの処理

is_file()ファイルが存在するかどうかをチェックするかどうかにかかわらfile_exists()ず、一部のアプリケーションでファイルが使用されている可能性があり、削除が妨げられ、unlink()「ResourceUnavailable」エラーが表示されます。

したがって、、、、...などの多くの方法を試した後、存在しないか、存在しているが一部のアプリケーションで使用されているファイルを「削除」する際のエラーを処理する唯一の最良のis_resource()方法に到達ましis_writable()stream_get_meta_data()

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.
}
于 2018-09-29T17:23:15.397 に答える
1

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;
    }
于 2016-10-15T15:35:47.800 に答える
0
if (file_exists($file) && is_writable($file)) {
    return  unlink($file);
}
于 2021-10-31T10:03:50.793 に答える