PHP経由でファイルを削除する方法


174

ファイルが別のディレクトリにある場合、PHPを使用してサーバーからファイルを削除するにはどうすればよいですか?

これが私のページレイアウトです:

  • projects/backend/removeProjectData.php (このファイルはデータベースのすべてのエントリを削除し、関連ファイルも削除する必要があります)
  • public_files/22.pdf (ファイルが置かれている場所。)

私はunlink関数を使用しています:

unlink('../../public_files/' . $fileName);

しかし、これにより常にファイルが存在しないというエラーが発生します。何か案は?


2
<pre>絶対パスを使用</ pre>
Pavunkumar

1
実際のパスを使用してチェックしないと、「。」を取得する可能性があります。および ".."非ファイルも原因で、ファイルが存在しないというエラーが発生する
DrogoNevets

1
ただし、ファイルに複数のファイル名/シンボリックリンクがある場合、ファイルが実際に削除されない可能性があることに注意してください。詳細は、このスレッドを参照してください。stackoverflow.com/q/17548906/1114320
SLIQ

回答:


229

以下が役立つはずです

  • realpath —正規化された絶対パス名を返す
  • is_writable -ファイル名が書き込み可能かどうかを通知します
  • unlink -ファイルを削除する

realpathを介してファイルパスを実行し、返されたパスが書き込み可能かどうかを確認し、書き込み可能であればリンクを解除します。


7
w3shoolsはこれをどのように行っているのでしょうか。w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@Gordon申し訳ありません。間違った用語を使用したため、大きな違いが生じます..私はそれがばかげていることに同意します.....私が意味しようとしたことは、コーディング例がより役立つでしょう..他の3つのリンクにアクセスする必要がある場合あなたの返事を理解することはとても役に立ちますか?..間違った単語でもう一度申し訳ありません。私は英語圏の国ではありません...言い訳にはなりませんが...
Ritabrata Gautam

13
@RitabrataGautam「返信を理解するために他の3つのリンクにアクセスする必要がある場合、それは非常に役に立ちますか?」- はい、そうです。リンクに行った後、あなたはそれがどのように機能するかを理解しているでしょう。コードを教えても、理解できず、コピーして貼り付けるだけです。その時あなたは何を学びましたか?何もない。その上、そのためのコードは非常に簡単です。
ゴードン

1
@Gordon ..同意する..あなたの見解は尊重を要求する..あなたはそれを#185K獲得した..たった2つの簡単な質問... 1>私があなたの返答を完全だと考えるなら、なぜ多くのモデレーターがいくつかのコードも提供するべきだと言う理由...リンクだけではありません(多くの反対投票が発生します)... 2>コードを記述した方がいいでしょう。学習傾向のある人は、これらのリンクに確実にアクセスし、準備ができたコードを取得するために再びgoogleにアクセスすることはありません。
Ritabrata Gautam

2
答えは私には十分に簡単に思えましたが、必要なコード例は次のとおりです。$ path = realpath( '../../ public_files /'。$ fileName); if(is_writable($ path)){unlink($ path);}
me_

102
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}

11
file_exists関数を使用するための投票。そうしないと、ファイルが存在しない場合にエラーが発生します。
Mahdi、2015年

17

まず、ファイルに対する権限を確認して、a)スクリプトからそれを確認し、b)ファイルを削除できることを確認してください。

現在スクリプトを実行しているディレクトリから計算されたパスを使用することもできます。例:

unlink(dirname(__FILE__) . "/../../public_files/" . $filename);

(PHP 5.3 __DIR__では、代わりに定数を使用できると思いますがdirname()、私自身はまだ使用していません)


パーミッションをチェックしたところ、最初はファイルを見ることができませんでしたが、今ではリアルパスのおかげですべてが機能します。アドバイスありがとう
Ken

7

次を使用してファイルを削除できます

unlink($Your_file_path);

しかし、httpパスからファイルを削除する場合、このリンク解除は適切に機能しません。正しいファイルパスを指定する必要があります。


4

AIOソリューションは、すべてを処理します。それは私の仕事ではありませんが、自分自身を改善しただけです。楽しい!

/**
 * Unlink a file, which handles symlinks.
 * @see https://github.com/luyadev/luya/blob/master/core/helpers/FileHelper.php
 * @param string $filename The file path to the file to delete.
 * @return boolean Whether the file has been removed or not.
 */
function unlinkFile ( $filename ) {
    // try to force symlinks
    if ( is_link ($filename) ) {
        $sym = @readlink ($filename);
        if ( $sym ) {
            return is_writable ($filename) && @unlink ($filename);
        }
    }

    // try to use real path
    if ( realpath ($filename) && realpath ($filename) !== $filename ) {
        return is_writable ($filename) && @unlink (realpath ($filename));
    }

    // default unlink
    return is_writable ($filename) && @unlink ($filename);
}

完璧に見えますが、感謝unlinkしますが、関数の名前として使用できないため、更新してください。
Reham Fahmy

クラスのパブリック静的関数の場合、unlinkは有効な関数名です:3v4l.org/MgA2l
nadar

そうですが、現在のシナリオでは、スタンドアロンの方が適しています。
Junaid Atari、

1

私はこの質問が少し古いことを知っていますが、これは私が取り組んでいるプロジェクトから画像を削除するのに非常にうまく機能する単純なものです。

unlink(dirname(__FILE__) . "/img/tasks/" . 'image.jpg');

dirname(__FILE__)セクションには、プロジェクトへのベースパスを出力します。/img/tasks/私のベースパスから2つのフォルダをダウンしています。そして最後に、私が削除したい私のイメージがあり、あなたはあなたが必要なものにすることができます。

これで、サーバー上のファイルにアクセスして削除することに問題はありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.