Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Dateileichen suchen und löschen?
Frage
Folgendes Problem:
In einer MySQL Datenbank habe ich unter anderen zu diversen Einträgen einen Verweis auf 2 Bilddateien stehen. Diese Bilddateien befinden sich in einem Ordner /images.
Von Zeit zu Zeit kommt es aus unterschiedlichen Gründen dazu das zwar der Eintrag in der MySQL Datenbank nicht mehr besteht (weil er z.B. gelöscht wurde) die Bilder aber nach wie vor im /images Verzeichnis liegen.
Die Lösung wäre also ein Script das nach Dateien sucht zu denen es keinen Eintrag in der MySQL Datenbank mehr gibt und diese löscht.
Wie könnte ich sowas realisieren. Ich bring das absolut nicht hin. Der Images Ordner liegt übrigens auf einem Linux Rechner.
Antwort 1 von abc123
Versuche dieses Skript.
Das Löschen habe ich vorerst auskommentiert:
Siehe //unlink($file);
Lass es zuerst mal so laufen und wenn es ohne Probleme geht, kannst Du das Löschen aktivieren.
So wie es jetzt ist würde es nur die zu löschenden Dateien ausgeben.
<?php
$db_server = ""; // Server. z.B localhost
$db_name = ""; // Datenbankname
$db_user = ""; // Loginname
$db_passwd = ""; // Passwort
$table_name = ""; // Tabelle mit den Dateinamen
$field_name = ""; // Feld in der Tabelle, das den Namen enthält
$image_path = ""; // Verzeichnis, wo die Grafikdateien sind
//----------------------------------------------------------
$fileList = array();
$db = mysql_connect($db_server, $db_user, $db_passwd)
or die("Verbindung zur Datenbank fehlgeschlagen!");
mysql_select_db($db_name, $db)
or die("Konnte Datenbank nicht auswählen!");
$result = mysql_query("SELECT $field_name FROM $table_name") or die ("Abfragefehler!");
while(($row = mysql_fetch_array($result))!= false)
array_push($fileList, $row[$field_name]);
mysql_close($db);
$deletedCount=0;
$dir=opendir("$image_path");
while($file = readdir($dir)) {
if(is_file($file) && !in_array($file, $fileList)) {
//unlink($file);
echo $file . " gelöscht.<br>";
$deletedCount+=1;
}
}
closedir($dir);
echo "Fertig. $deletedCount Datei(en) gelöscht.<br>";
?>
Gruss,
Michael
Das Löschen habe ich vorerst auskommentiert:
Siehe //unlink($file);
Lass es zuerst mal so laufen und wenn es ohne Probleme geht, kannst Du das Löschen aktivieren.
So wie es jetzt ist würde es nur die zu löschenden Dateien ausgeben.
<?php
$db_server = ""; // Server. z.B localhost
$db_name = ""; // Datenbankname
$db_user = ""; // Loginname
$db_passwd = ""; // Passwort
$table_name = ""; // Tabelle mit den Dateinamen
$field_name = ""; // Feld in der Tabelle, das den Namen enthält
$image_path = ""; // Verzeichnis, wo die Grafikdateien sind
//----------------------------------------------------------
$fileList = array();
$db = mysql_connect($db_server, $db_user, $db_passwd)
or die("Verbindung zur Datenbank fehlgeschlagen!");
mysql_select_db($db_name, $db)
or die("Konnte Datenbank nicht auswählen!");
$result = mysql_query("SELECT $field_name FROM $table_name") or die ("Abfragefehler!");
while(($row = mysql_fetch_array($result))!= false)
array_push($fileList, $row[$field_name]);
mysql_close($db);
$deletedCount=0;
$dir=opendir("$image_path");
while($file = readdir($dir)) {
if(is_file($file) && !in_array($file, $fileList)) {
//unlink($file);
echo $file . " gelöscht.<br>";
$deletedCount+=1;
}
}
closedir($dir);
echo "Fertig. $deletedCount Datei(en) gelöscht.<br>";
?>
Gruss,
Michael
Antwort 2 von einherjer
Sorry wegen der späten Antwort!
Habe das Script ausprobiert, allerdings kommt immer 0 Dateien gelöscht.
Habe ca. 30 Files in das entsprechende Verzeichnis kopiert die nicht in der Datenbank vorkommen.
Habe das Script ausprobiert, allerdings kommt immer 0 Dateien gelöscht.
Habe ca. 30 Files in das entsprechende Verzeichnis kopiert die nicht in der Datenbank vorkommen.
Antwort 3 von einherjer
Das Problem lag anscheinend am is_file
nachdem ich die Bedingung entfernt habe funktioniert das löschen ohne Probleme.
Nochmals danke, ich konnte das Script relativ schnell in meine Anwendung integrieren.
nachdem ich die Bedingung entfernt habe funktioniert das löschen ohne Probleme.
Nochmals danke, ich konnte das Script relativ schnell in meine Anwendung integrieren.
Antwort 4 von abc123
Ich würde Dir empfehlen das ganze genau zu prüfen, bevor Du das Skript einsetzt.
Vor allem kann es problematisch werden, wenn die Dateinamen in der Datenbank mit vollständigen Pfad gespeichert sind.
Dazu ein Beispiel:
In Datenbank
/webroot/uploads/steuer2002.xls
Im Skript
uploads/steuer2002.xls
Der Vergleich schlägt fehl und die Datei wird gelöscht!!!
Genauso kann es zu Laufzeitfehlern kommen, wenn das Verzeichnis, in dem die dateien sind, Unterverzeichnisse oder Dateien enthält, die Schreibschutz haben.
Vergleiche die Einträge in der DB, mit denen, die im Skript ermittelt werden.
while(($row = mysql_fetch_array($result))!= false) {
array_push($fileList, $row[$field_name]);
echo $row[$field_name] . "<br>"; // Kontrollausgabe
}
Klartext: Fehlerprüfung einbauen, um alle möglichen Ausnahmefälle abzufangen.
Gruss,
Michael
Vor allem kann es problematisch werden, wenn die Dateinamen in der Datenbank mit vollständigen Pfad gespeichert sind.
Dazu ein Beispiel:
In Datenbank
/webroot/uploads/steuer2002.xls
Im Skript
uploads/steuer2002.xls
Der Vergleich schlägt fehl und die Datei wird gelöscht!!!
Genauso kann es zu Laufzeitfehlern kommen, wenn das Verzeichnis, in dem die dateien sind, Unterverzeichnisse oder Dateien enthält, die Schreibschutz haben.
Vergleiche die Einträge in der DB, mit denen, die im Skript ermittelt werden.
while(($row = mysql_fetch_array($result))!= false) {
array_push($fileList, $row[$field_name]);
echo $row[$field_name] . "<br>"; // Kontrollausgabe
}
Klartext: Fehlerprüfung einbauen, um alle möglichen Ausnahmefälle abzufangen.
Gruss,
Michael

