PHP ile dosya nasıl silinir?


174

Dosya başka bir dizindeyse PHP ile sunucumdan bir dosyayı nasıl silebilirim?

İşte sayfa düzenim:

  • projects/backend/removeProjectData.php (bu dosya veritabanı için tüm girişlerimi siler ve ilgili dosyayı da silmelidir)
  • public_files/22.pdf (dosyanın bulunduğu yer.)

Bu unlinkişlevi kullanıyorum :

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

Ancak bu her zaman dosyanın mevcut olmadığı konusunda bir hata veriyor. Herhangi bir fikir?


2
<pre> Mutlak yol kullan </pre>
Pavunkumar

1
gerçek yolu kullanarak kontrol etmezseniz, "." ve ".." dosyaları da içermiyor, dosyada hatalar yok
DrogoNevets

1
Ancak, dosyanızda birden fazla dosya adı / simge varsa bu dosyanızı gerçekten silmeyebilir! Daha fazla bilgi için bu konuya bakın: stackoverflow.com/q/17548906/1114320
Sliq

Yanıtlar:


229

Aşağıdakiler yardımcı olmalıdır

  • realpath - Standartlaştırılmış mutlak yol adını döndürür
  • is_writable - Dosya adının yazılabilir olup olmadığını söyler
  • unlink - Bir dosyayı siler

Dosya yolunuzu realpath üzerinden çalıştırın, sonra döndürülen yolun yazılabilir olup olmadığını kontrol edin ve varsa bağlantısını kaldırın.


7
W3shools'un bunu nasıl yaptığını merak ediyorum? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@ Üzgünüm .. büyük bir fark yaratan terim yanlış kullanılan .. i aptalca katılıyorum .. ama ne demek istediğim bir kodlama örneği daha yararlı olurdu .. diğer üç bağlantıları ziyaret etmek gerekirse Cevabınızı anlamak çok yararlı mı? .. yanlış kelime için tekrar üzgünüm .. ben ingilizce konuşan ülkeden değilim ... bir bahane olamaz ...
Ritabrata Gautam

13
@RitabrataGautam "Cevabınızı anlamak için diğer üç bağlantıyı ziyaret etmem gerekirse çok yardımcı olur mu?" - Evet öyle. Çünkü bağlantılara gittikten sonra nasıl çalıştığını anlayacaksınız. Size sadece kodları verirsem, anlamazsınız, sadece kopyalayıp yapıştırırsınız. O zaman ne öğrendin? Hiçbir şey değil. Ayrıca, bunun kodu çok önemsizdir.
Gordon

1
@Gordon .. katılıyorum .. görüşleriniz saygı istiyor .. # 185K kazandınız .. sadece iki hızlı soru ... 1> Cevabınızı tamamlanmış olarak değerlendirirsem, neden birçok moderatör neden bazı kodlar vermeniz gerektiğini söylüyor ... sadece bağlantılar değil (birçok aşağı oylama neden olur) ... 2> u bazı kod koymak daha iyi olmaz. şimdi kim öğrenme eğilimi var kesinlikle bu bağlantıları ziyaret edecek ve kim hazır kodu almak için tekrar google gidecek sahip değil.
Ritabrata Gautam

2
cevap benim için yeterince basit görünüyordu: ama istediğiniz kod örneği: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_

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

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

11
file_existsişlevi kullanmak için oy kullandı . Aksi takdirde dosya yoksa bir hata alırsınız.
Mehdi

17

A) betiğinizden görebildiğinizden ve b) silebildiğinden emin olmak için öncelikle dosyadaki izinlerinizi kontrol edin.

Komut dosyasını şu anda çalıştırdığınız dizinden hesaplanan bir yolu da kullanabilirsiniz, örneğin:

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

(PHP 5.3'te __DIR__bunun yerine sabiti kullanabileceğinize inanıyorum dirname()ama henüz kendim kullanmadım)


İzinleri kontrol ettim ve ilk başta dosyayı göremedim ama şimdi her şey realpath sayesinde çalışıyor. tavsiye için teşekkürler
Ken

7

Kullanarak dosyayı silebilirsiniz

unlink($Your_file_path);

ancak bir dosyayı http yolundan siliyorsanız, bu bağlantı kaldırma düzgün çalışmaz. Bir dosya yolunu doğru vermelisiniz.


4

AIO çözümü, her şeyi halleder, Bu benim işim değil, sadece kendimi geliştirdim. Zevk almak!

/**
 * 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);
}

mükemmel görünüyor, çok teşekkürler ama unlinkişleviniz için ad olarak kullanamayacağınız için lütfen güncelleyin .
Reham Fahmy

Bir sınıftaki genel statik işleviyse
nadar

Evet, ama şu anki senaryoda, Bağımsız daha iyi bir seçim.
Junaid Atari

1

Bu sorunun biraz eski olduğunu biliyorum, ama bu benim üzerinde çalıştığım projeden görüntüleri silmek için çok iyi çalışan basit bir şey.

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

dirname(__FILE__)Bölüm projenize taban yolunu yazdırır. /img/tasks/Benim taban yolundan iki klasör çöktü. Ve son olarak, silmek istediğim görüntüye ihtiyacım olan her şeyi yapabileceğiniz bir görüntü var.

Bununla sunucumdaki dosyalarıma alma ve silme konusunda herhangi bir sorun yaşamadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.