Bagaimana cara menghapus file melalui PHP?

174

Bagaimana cara menghapus file dari server saya dengan PHP jika file ada di direktori lain?

Inilah tata letak halaman saya:

  • projects/backend/removeProjectData.php (file ini menghapus semua entri saya untuk database dan juga harus menghapus file terkait)
  • public_files/22.pdf (tempat file berada.)

Saya menggunakan unlinkfungsi:

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

Tapi ini selalu memberi saya kesalahan bahwa file tersebut tidak ada. Ada ide?

Ken
sumber
2
<pre> Gunakan jalur absolut </pre>
Pavunkumar
1
jika Anda tidak memeriksa menggunakan jalur nyata, Anda cenderung mendapat "." dan ".." juga bukan file, menyebabkan file tidak ada kesalahan
DrogoNevets
1
Namun berhati-hatilah, ini mungkin tidak benar-benar menghapus file Anda jika file Anda memiliki banyak nama file / symlink! Lihat utas ini untuk info lebih lanjut: stackoverflow.com/q/17548906/1114320
Sliq

Jawaban:

229

Berikut ini akan membantu

  • realpath - Mengembalikan pathname absolut yang dikanonikalisasi
  • is_writable - Memberitahu apakah nama file dapat ditulisi
  • unlink - Menghapus file

Jalankan filepath Anda melalui realpath, lalu periksa apakah jalur yang dikembalikan dapat ditulisi dan jika demikian, putuskan tautannya.

Gordon
sumber
7
Saya bertanya-tanya bagaimana w3shools melakukan ini? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr
3
@Gordon saya minta maaf .. saya menggunakan istilah yang salah yang membuat perbedaan besar .. saya setuju itu bodoh .. tapi apa yang saya coba maksudkan adalah contoh pengkodean akan lebih membantu .. jika saya perlu mengunjungi tiga tautan lainnya untuk memahami balasan Anda, apakah ini sangat membantu? ..mohon lagi untuk kata yang salah .. saya bukan dari negara berbahasa inggris ... meskipun itu tidak bisa menjadi alasan ...
Ritabrata Gautam
13
@RitabrataGautam "jika saya perlu mengunjungi tiga tautan lain untuk memahami balasan Anda, apakah ini sangat membantu?" - Ya itu. Karena setelah masuk ke tautan Anda akan mengerti cara kerjanya. Jika saya hanya memberi Anda kode, Anda tidak akan mengerti tetapi hanya menyalin dan menempel. Apa yang kamu pelajari saat itu? Tidak ada. Selain itu, kode untuk itu sangat sepele.
Gordon
1
@Gordon .. saya setuju .. pandangan Anda menuntut rasa hormat .. Anda mendapatkannya # 185K .. hanya dua pertanyaan cepat ... 1> jika saya menganggap balasan Anda selesai maka mengapa banyak moderator di sini mengatakan bahwa Anda harus memberikan beberapa kode juga ... bukan hanya tautan (itu menyebabkan banyak suara turun) ... 2> bukankah lebih baik jika Anda menaruh beberapa kode. sekarang yang memiliki kecenderungan belajar mereka pasti akan mengunjungi tautan-tautan itu dan siapa yang tidak memiliki itu akan kembali ke google untuk mendapatkan kode yang siap.
Ritabrata Gautam
2
jawabannya tampak cukup jelas bagi saya: tetapi contoh kode yang Anda inginkan: $ 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.
    }
}
UbiQue
sumber
11
dipilih untuk menggunakan file_existsfungsi. Kalau tidak, Anda akan mendapatkan kesalahan jika file tidak ada.
Mahdi
17

Pertama-tama periksa izin Anda pada file, untuk memastikan Anda dapat a) melihatnya dari skrip Anda, dan b) dapat menghapusnya.

Anda juga dapat menggunakan jalur yang dihitung dari direktori tempat Anda menjalankan skrip, misalnya:

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

(di PHP 5.3 saya yakin Anda bisa menggunakan __DIR__konstanta, dirname()tapi saya belum menggunakannya sendiri)

kekayaan
sumber
Saya memeriksa izin dan saya tidak dapat melihat file pada awalnya, tetapi sekarang semuanya bekerja berkat realpath. terima kasih untuk nasehatnya
Ken
7

Anda dapat menghapus file menggunakan

unlink($Your_file_path);

tetapi jika Anda menghapus file dari jalur http-nya maka pembatalan tautan ini tidak berfungsi dengan baik. Anda harus memberikan jalur file yang benar.

ankit suthar
sumber
4

Solusi AIO, menangani semuanya, Ini bukan pekerjaan saya tapi saya hanya meningkatkan diri saya sendiri. Nikmati!

/**
 * 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);
}
Junaid Atari
sumber
terlihat sempurna, terima kasih banyak tapi tolong perbarui karena Anda tidak dapat menggunakan unlinknama untuk fungsi Anda.
Reham Fahmy
Jika ini merupakan fungsi statis publik di kelas, batalkan tautan adalah nama fungsi yang valid: 3v4l.org/MgA2l
nadar
Ya, tetapi dalam skenario saat ini, Standalone adalah pilihan yang lebih baik.
Junaid Atari
1

Saya tahu pertanyaan ini agak lama, tetapi ini adalah sesuatu yang sederhana yang berfungsi dengan baik untuk menghapus gambar dari proyek yang sedang saya kerjakan.

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

The dirname(__FILE__)Bagian mencetak path basis untuk proyek Anda. Itu/img/tasks/ dua folder di bawah dari jalur dasar saya. Dan akhirnya, ada gambar saya yang ingin saya hapus yang dapat Anda buat menjadi apa pun yang Anda butuhkan.

Dengan ini saya tidak punya masalah untuk mendapatkan file saya di server saya dan menghapusnya.

abetwothree
sumber