Wie lösche ich eine Datei über PHP?

174

Wie lösche ich eine Datei mit PHP von meinem Server, wenn sich die Datei in einem anderen Verzeichnis befindet?

Hier ist mein Seitenlayout:

  • projects/backend/removeProjectData.php (Diese Datei löscht alle meine Einträge für die Datenbank und sollte auch die zugehörige Datei löschen.)
  • public_files/22.pdf (Der Ort, an dem sich die Datei befindet.)

Ich benutze die unlinkFunktion:

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

Dies gibt mir jedoch immer den Fehler, dass die Datei nicht existiert. Irgendwelche Ideen?

Ken
quelle
2
<pre> Verwenden Sie den absoluten Pfad </ pre>
Pavunkumar
1
Wenn Sie nicht anhand des realen Pfads prüfen, erhalten Sie wahrscheinlich das "." und ".." Nicht-Dateien auch, verursacht Datei existiert keine Fehler
DrogoNevets
1
Beachten Sie jedoch, dass Ihre Datei möglicherweise nicht wirklich gelöscht wird, wenn Ihre Datei mehrere Dateinamen / Symlinks enthält! Siehe diesen Thread für weitere Informationen: stackoverflow.com/q/17548906/1114320
Sliq

Antworten:

229

Folgendes sollte helfen

  • realpath - Gibt den kanonisierten absoluten Pfadnamen zurück
  • is_writable - Gibt an, ob der Dateiname beschreibbar ist
  • unlink - Löscht eine Datei

Führen Sie Ihren Dateipfad über realpath aus, überprüfen Sie, ob der zurückgegebene Pfad beschreibbar ist, und heben Sie in diesem Fall die Verknüpfung auf.

Gordon
quelle
7
Ich frage mich, wie w3shools das macht. w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr
3
@ Gordon Es tut mir leid. Ich habe den Begriff falsch verwendet, was einen großen Unterschied macht. Ich stimme zu, dass er idiotisch war. Aber was ich damit meinen wollte, ist, dass ein Codierungsbeispiel hilfreicher wäre. Wenn ich drei andere Links besuchen muss Um Ihre Antwort zu verstehen, ist es sehr hilfreich? ..sorry wieder für das falsche Wort .. Ich bin nicht aus dem englischsprachigen Land ... obwohl es keine Entschuldigung sein kann ...
Ritabrata Gautam
13
@RitabrataGautam "Wenn ich drei andere Links besuchen muss, um Ihre Antwort zu verstehen, ist es sehr hilfreich?" - Ja, so ist es. Denn nachdem Sie zu den Links gegangen sind, haben Sie verstanden, wie es funktioniert. Wenn ich Ihnen nur die Codes gebe, werden Sie nicht verstehen, sondern nur kopieren und einfügen. Was hast du dann gelernt? Nichts. Außerdem ist der Code dafür sehr trivial.
Gordon
1
@ Gordon .. Ich stimme zu .. Ihre Ansichten erfordern Respekt .. Sie haben es verdient # 185K .. nur zwei kurze Fragen ... 1> Wenn ich Ihre Antwort als vollständig betrachte, warum sagen dann viele Moderatoren hier, dass Sie auch Code bereitstellen sollten ... nicht nur Links (es verursacht viele Abstimmungen) ... 2> Wäre es nicht besser, wenn Sie einen Code eingeben. Jetzt, wo Lernneigung besteht, werden sie diese Links sicherlich besuchen und wer nicht hat, dass sie erneut zu Google gehen, um einen fertigen Code zu erhalten.
Ritabrata Gautam
2
Die Antwort schien mir direkt zu sein: aber das gewünschte Codebeispiel: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {Verknüpfung aufheben ($ 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
quelle
11
für die Verwendung der file_existsFunktion hochgestimmt. Andernfalls wird eine Fehlermeldung angezeigt, wenn die Datei nicht vorhanden ist.
Mahdi
17

Überprüfen Sie zunächst Ihre Berechtigungen für die Datei, um sicherzustellen, dass Sie a) sie in Ihrem Skript sehen und b) sie löschen können.

Sie können auch einen Pfad verwenden, der aus dem Verzeichnis berechnet wurde, in dem Sie das Skript gerade ausführen, z.

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

(in PHP 5.3 glaube ich, dass Sie die __DIR__Konstante anstelle von verwenden können, dirname()aber ich habe sie selbst noch nicht verwendet)

Reichtum
quelle
Ich habe die Berechtigungen überprüft und konnte die Datei zunächst nicht sehen, aber jetzt funktioniert dank des Realpaths alles. Danke für den Rat
Ken
7

Sie können die Datei mit löschen

unlink($Your_file_path);

Wenn Sie jedoch eine Datei aus ihrem http-Pfad löschen, funktioniert diese Verknüpfung nicht ordnungsgemäß. Sie müssen einen korrekten Dateipfad angeben.

Ankit Suthar
quelle
4

AIO-Lösung, erledigt alles. Es ist nicht meine Arbeit, aber ich habe mich nur verbessert. Genießen!

/**
 * 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
quelle
sieht perfekt aus, vielen Dank, aber bitte aktualisieren Sie es, da Sie nicht unlinkals Namen für Ihre Funktion verwenden können.
Reham Fahmy
Wenn es sich um eine öffentliche statische Funktion in einer Klasse handelt, ist die Verknüpfung aufheben
nadar
Ja, aber im aktuellen Szenario ist Standalone die bessere Wahl.
Junaid Atari
1

Ich weiß, dass diese Frage etwas alt ist, aber dies ist etwas Einfaches, das für mich sehr gut funktioniert, um Bilder aus meinem Projekt zu löschen, an dem ich arbeite.

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

Der dirname(__FILE__)Abschnitt druckt den Basispfad zu Ihrem Projekt aus. Das/img/tasks/ sind zwei Ordner von meinem Basispfad entfernt. Und schließlich gibt es mein Bild, das ich löschen möchte und das Sie zu allem machen können, was Sie brauchen.

Damit hatte ich kein Problem damit, auf meine Dateien auf meinem Server zuzugreifen und sie zu löschen.

abetwothree
quelle