• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP] Mit unlink die zuletzt erstellte PHP Seite löschen / delete

LikeStar

New member
Erledigt

ERLEDIGT

Hallo,

die zuletzt erstellte PHP Seite, welche sich in einem Ordner befindet,
soll gelöscht werden - Wahrscheinlich wird nach Datum und Uhrzeit geprüft.

PHP:
<?php
$fh = fopen('test.html', 'a');
fwrite($fh, '<h1>Hallo Welt!</h1>');
fclose($fh);

unlink('test.html');
?>

Gibt es dafür einen Begriff?
 
Zuletzt bearbeitet:
Das tust du doch in deiner letzten Zeile.

Hm. Nein nicht wirklich.

In einem Ordner befinden sich

beispiel.php
beispiel(kopie).php
beispiel(kopie1).php
beispiel(kopie2).php
beispiel(kopie3).php
beispiel(kopie4).php

Ich möchte, dass die zuletzt erstellte Datei gelöscht wird. Das kriege ich mit
PHP:
 $myFile = "php/";

 unlink($myFile);


Hin. Allerdings will er unbedingt einen Namen haben. Sonst funktioniert das leider nicht.
 
Zuletzt bearbeitet:
Du musst zuerst die Dateinamen ermitteln, z. B. mit glob(). Dann über diese iterieren und das Datum des Erstellens mit filectime() ermitteln. Beide Werte, Zeit und Dateiname in ein assoziatives array eintragen mit Zeit als Schlüssel und dann sortieren mit ksort(). Dann findest Du die Datei, die zuletzt erstellt wurde, als letztes Element des Arrays und kannst sie löschen.
 
Du musst zuerst die Dateinamen ermitteln, z. B. mit glob(). Dann über diese iterieren und das Datum des Erstellens mit filectime() ermitteln. Beide Werte, Zeit und Dateiname in ein assoziatives array eintragen mit Zeit als Schlüssel und dann sortieren mit ksort(). Dann findest Du die Datei, die zuletzt erstellt wurde, als letztes Element des Arrays und kannst sie löschen.

:moody:

Okay. Danke.
 
Inzwischen ist mir eingefallen, dass es noch etwas einfacher geht: Über die Dateinamen iterieren. Dateiname und Zeit merken. Ist die Zeit größer als die gemerkte, Dateiname und Zeit ersetzen.
Hier findest Du noch mehr Algorithmen:
php - Get last modified file in a directory - Stack Overflow
Mir gefällt die mit dem Directory-Iterator am besten, weil diese nur einmal iteriert.

Danke für diesen Link!

D.h. er könnte theoretisch per Klick Dateien mit der Endung .php nach einander löschen.
Also klick für klick.

Super.

Edit:

Habe ein Superscript, welches tatsächlich die zuletzt erstellte Datei anzeigen tut.

PHP:
$path = "xampp/htdocs/advance/php/";
$timestamp = null;

$dirname = dirname(__FILE__);
$dir = new DirectoryIterator($dirname);
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        if ($fileinfo->getMTime() > $timestamp) {
            // current file has been modified more recently
            // than any other file we've checked until now
            $path = $fileinfo->getFilename();
            $timestamp = $fileinfo->getMTime();
        }
    }
}

var_dump($path);

Aber mein $path="xampp/htdocs/advance/php/" wird einfach ignoriert. Stattdessen wird alternativ
im Ordner in dem sich das PHP Script selbst befindet, gesucht.

Eine Idee?
 
Zuletzt bearbeitet:
Den Verzeichnisnamen, in dem gesucht werden soll, weist Du hier zu:
PHP:
$dirname = dirname(__FILE__);
wobei __FILE__ die aktuelle Datei ist. Dein $path hat keine Auswirkung, denn das ist lediglich eine Initialisierung für den gemerkten Dateinamen, die später wieder überschrieben wird. Von dirname(__FILE__) ausgehend musst Du das Verzeichnis, in dem gesucht werden soll, angeben. Man könnte auch einen absoluten Pfad angeben, aber das ist aus Gründen der Portierbarkeit weniger zu empfehlen: Wenn dann dein Skript lokal funktioniert, tut es das auf dem Server wahrscheinlich nicht mehr.
 
Zuletzt bearbeitet:
Den Verzeichnisnamen, in dem gesucht werden soll, weist Du hier zu:

wobei __FILE__ die aktuelle Datei ist. Dein $path hat keine Auswirkung, denn das ist lediglich eine Initialisierung für den gemerkten Dateinamen, die später wieder überschrieben wird. Von dirname(__FILE__) ausgehend musst Du das Verzeichnis, in dem gesucht werden soll, angeben. Man könnte auch einen absoluten Pfad angeben, aber das ist aus Gründen der Portierbarkeit weniger zu empfehlen: Wenn dann dein Skript lokal funktioniert, tut es das auf dem Server wahrscheinlich nicht mehr.

Danke für deine Rückmeldung.

Der Code wurde angepasst.

PHP:
<?php
$path = null;
$timestamp = null;

$dirname = "php/";
$dir = new DirectoryIterator($dirname);
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        if ($fileinfo->getMTime() > $timestamp) {
            // current file has been modified more recently
            // than any other file we've checked until now
            $path = $fileinfo->getFilename();
            $timestamp = $fileinfo->getMTime();
        }
    }
}

var_dump($path);  
unlink($dir);
?>

Habe unten noch ein unlink($dir); eingebaut. Wenn ich das Script ausführe, findet er zwar in dem richtigen Ordner die zuletzt erstelte Datei

aber er führt das löschen nicht richtig aus.

Warning: unlink(index.php): No such file or directory in C:\Program Files (x86)\xampp\htdocs\advance\loeschen.php on line 15

Warning: unlink(test.php): No such file or directory in C:\Program Files (x86)\xampp\htdocs\advance\loeschen.php on line 15


Witzigerweise löscht er die index.php Seite aus dem Ordner, in dem das obige Script liegt.


@gform
Was wolltest du damit ausdrücken? :)
 
Bei der Verwendung von unlink() musst Du zwingend* einen absoluten Pfad hinterlegen (ich lösche bei Bedarf Sitzungsvariablen im privaten Bereich (Verzeichnis) und komme selbst nicht drum herum). Bedenke, dass dies bei Windows anders aussieht als auf Linux (wie umgekehrt)!

* heißt: Ich habe keine andere Möglichkeit einst gefunden, das bei mir zu lösen.
 
Bei der Verwendung von unlink() musst Du zwingend* einen absoluten Pfad hinterlegen
Normal. Ist in Perl auch so.

Bedenke, dass dies bei Windows anders aussieht als auf Linux (wie umgekehrt)!
Vorsicht, der Backslash ist ja auch für das Escaping zusändig, wenn dann also zwei Backslashe verwenden.
Aber bist du sicher, dass man mit PHP auf Windows keine normalen Schrägstriche verwenden kan? In Perl brauche ich keine Backlashes für Pfade auf Windows.
 
Zuletzt bearbeitet:
@Sempervivum: Jupp, sagt es auch ... daher war ich auch einst super genervt davon. In meinem Fall half besagter Pfad - done.

EDIT: Gleiche Seite ... ein Kommentar eines anderen Users zu unlink() auf PHP.net und "ging nicht".
 
Hm, hab's ausprobiert und bei mir funktioniert es einwandfrei:
PHP:
    $testdatei = "text.txt";
    unlink($testdatei);
Die Datei lag im selben Verzeichnis wie die PHP-Datei.
 
Hallo,

für die Rückmeldungen möchte ich mich bedanken.

Das PHP Script, sucht die zuletzt erstellte Datei und gibt sie aus.
Um das zu verdeutlichen habe, ich ein Screenshot gemacht. Bitte im Anhang nach schauen.

Mit
PHP:
unlink($zuletzt_erstellte_Datei)
, wollte ich die zuletzt erstellte löschen.
Aber offensichtlich stelle ich mir das zu einfach vor.


Hier nochmal das Script, welches die zuletzt erstellte Datei anzeigen tut. Das scheint zu funktionieren.
PHP:
<?php

$path = null;
$timestamp = null;

$dirname = "php/";
$dir = new DirectoryIterator($dirname);
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        if ($fileinfo->getMTime() > $timestamp) {
            // current file has been modified more recently
            // than any other file we've checked until now
            $path = $fileinfo->getFilename();
            $timestamp = $fileinfo->getMTime();
            
            
        }
    }
}

var_dump($path); 


?>
 

Anhänge

  • angezeigt.jpg
    angezeigt.jpg
    40 KB · Aufrufe: 2
Du hast doch jetzt alle Informationen, die Du brauchst, um es zum Laufen zu bringen. Dein Problem ist wahrscheinlich, dass $fileinfo->getFilename() nur den Dateinamen liefert, während die Datei offenbar in einem Unterverzeichnis liegt. Wenn Du den absoluten Pfad verwendest, sollte es funktionieren:
$path = $fileinfo->getPathname();
und
unlink($path);
 
Du hast doch jetzt alle Informationen, die Du brauchst, um es zum Laufen zu bringen. Dein Problem ist wahrscheinlich, dass $fileinfo->getFilename() nur den Dateinamen liefert, während die Datei offenbar in einem Unterverzeichnis liegt. Wenn Du den absoluten Pfad verwendest, sollte es funktionieren:
$path = $fileinfo->getPathname();
und
unlink($path);

PHP:
<?php

$path = null;
$timestamp = null;

$dirname = "C:/Program Files (x86)/xampp/htdocs/advance/php/";
$dir = new DirectoryIterator($dirname);
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        if ($fileinfo->getMTime() > $timestamp) {
            // current file has been modified more recently
            // than any other file we've checked until now
            $path = $fileinfo->getFilename();
            $timestamp = $fileinfo->getMTime();
            
            
            
        }
    }
}

var_dump($path); 
unlink($path);

?>

Mit
PHP:
unlink($path)
habe ich's schon mehrmals versucht.
Warning: unlink(test.php): No such file or directory in C:\Program Files (x86)\xampp\htdocs\advance\loeschen.php on line 23

Er will diese Datei nicht löschen.
 
Zuletzt bearbeitet:
Zurück
Oben