Ordner auslesen und speichern

strex

Erfahrenes Mitglied
Hi Leute,

ich bekomm das irgendwie nicht so ganz hin.

Also ich möchte aus einem Ordner (blabla) alle Dateien auslesen und diese mit der Dateigröße, Erstellungsdatum und Dateiname in einer Datenbank speichern. Hat hier wer einen Codeschnippsel oder sowas wie ich das machen könnte?

Vielen Danke für eure Mühe!

Grüße strex
 
Also ich hab jetzt was gefunden und angepasst:

PHP:
<?PHP
function listAllPDF($dir=".",$type="otrkey") 
{ 
    $x = 0; 
    foreach (glob($dir."*.".$type) as $filename) 
    { 
        $pdf[$x]['filename'] = end(explode('/',$filename)); 
        $pdf[$x]['file'] = $filename; 
        $pdf[$x]['size'] = filesize($filename) / 1024; 
        $pdf[$x]['time'] = filemtime($filename); 
        $x++; 
    }  
     
    return $pdf; 
} 

$DatabaseHost = "localhost"; 
$DatabaseUser = ""; 
$DatabasePassword = ""; 
$Database = ""; 


$DatabasePointer=mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword); 
mysql_select_db($Database, $DatabasePointer); 


$pdf = listAllPDF(".../","otrkey");

for($x=0;$x<count($pdf);$x++)
{
    $files    =    $pdf[$x]['filename'];
	$filess    =    $pdf[$x]['file'];
    $size    =    number_format($pdf[$x]['size'], 1, ',', '.');
    $date    =    date("d.m.Y, H:i:s", $pdf[$x]['time']);
    
    $SQL = "INSERT INTO otrkey "; 
    $SQL .= "(Dateiname, Dateigroesse) VALUES "; 
    $SQL .= "('".$files."','".filesize($filess)."')"; 
    mysql_query($SQL, $DatabasePointer); 
    if(mysql_affected_rows($DatabasePointer)==1) 
    { 
        echo"Die Datei &quot;" . $files .  "&quot; wurde in die Tabelle eingefügt."; 
    } 
    else 
    { 
        echo"Die Datei &quot;" . $files . "&quot; konnte nicht in die Tabelle eingefügt werden."; 
    } 

}

mysql_close(); 

?>

Wenn ich das script 2 mal ausführe speichert er mir das doppelt. Wie kann ich das umgehen, dass er die schon vorhanden skippt und wenn diese nicht mehr exestieren wieder löscht.

grüße strex
 
Eine Möglichkeit, die mir spontan einfällt wäre die Daten, die schon in der Datenbank stehen auszulesen und in einem Array zu speichern (Dateiname und ID des Eintrags). Das Array dann schrittweise (foreach) duchlaufen und dabei prüfen, ob die Dateien vorhanden sind. Die Daten zu nicht mehr vorhandenen Dateien werden in einem zweiten Array gespeichert (da reicht im Prinzip die ID des entsprechenden Eintrags, außerdem aus dem ersten Array gelöscht (geht mit der Funktion array_unshift(), meine ich). Dieses neue Array mit den Daten der gelöschten Daten kannst du wieder Schrittweise durchlaufen lassen um die Einträge anhand der im Array gespeicherten ID des Eintrags aus der Datenbank zu löschen.

Beim neu einlesen der Daten kannst du jetzt noch prüfen, ob die Datei nicht schon im ersten bereinigten Array vorhanden sind. Oder aber du liest einfach alle ein und löschst alle doppelten Einträge mit array_unique().

Den Code musst du aber selbst anpassen, wäre ja sonst langweilig ;) Ich hoffe trotzdem ein wenig geholfen haben zu können.
 
Ich habe ein weitere Lösung gefunden. Ich lösche die komplette DB. Somit sind auch keine doppelten Einträge vorhanden und kostet auch nicht viel mehrzeit, da das script dann jeweils alle 60min automatisch durchläuft.:rolleyes:
 
Eine Frage hätte ich noch. Ich gebe die Daten wieder so aus:

PHP:
$DatabasePointer=mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword); 
mysql_select_db($Database); 

//Daten werden ausgelesen und ausgegeben
$sql = "SELECT Dateiname, Dateigroesse, date, Link FROM otrkey";
$ergebnis = mysql_query($sql, $DatabasePointer);

while ($satz = mysql_fetch_row($ergebnis)) {
   echo "Dateiname: $satz[0] <br>"; 
   echo "Dateigröße: $satz[1] <br>";
   echo "Date: $satz[2] <br>";
   echo "Link: $satz[3] <br>";
}  

mysql_close();

Nun möchte ich diese aber nach Datum, der im Dateinamen angegeben ist sotieren. Könnte mir das einer modifizieren, dass das so klappt?

Dateiname sieht so aus: Alle_unter_einem_Dach_06.11.03_05-55_kabel1_30_TVOON_DE.mpg.avi.otrkey

Danke für die Hilfe!

grüße strex
 
Das Datum haste doch auch in der Datenbank gespeichert, sortiers doch einfach darüber. Ich gehe mal davon aus, dass das Datum, das in der Datenbank steht dem im Dateinamen entspricht. Ansonsten bleibt dir nur der Weg die Daten aus der Datenbank in nem Array zu speichern
PHP:
...
while ( $satz = mysql_fetch_assoc( $ergebnis ) ) 
{
    $arr_filme[][ 'Dateiname' ] = $satz[ 'Dateiname' ];
    $arr_filme[][ 'Dateigroesse' ] = $satz[ 'Dateigroesse' ];
    $arr_filme[][ 'date' ] = $satz[ 'date' ];
    $arr_filme[][ 'Link' ] = $satz[ 'Link' ];
} 
...
Jetzt kommt der etwas schwierigere Teil, in dem du das Datum aus dem Dateinamen "herauslöst", um die Einträge später danach sortieren zu können. Am besten wird das wohl per preg_match() und Regular Expressions gehen. Da ich darin aber nicht besonders bewandert bin, kann ich dir leider kein fertiges Script liefern. Sollte aber wie folgt aussehen
PHP:
...
$arr_filme_count = count( $arr_filme );
for( $i = 0 ; $i < $ar_filme_count ; $i++ )
{
    preg_match( '/REGEXFÜR TT.MM.JJJJ/' , $arr_filme[ $i ][ 'Dateiname' ] , $datum );
    $arr_datum = explode( '.' , $datum[ 1 ] ); // Je nach Aufbau des RegEx kann das auch $datum[ 2 ] / $datum[ n ] sein.
    $arr_filme[ $i ][ 'Datum' ] = $arr_datum[ 2 ] . '-' . $arr_datum[ 1 ] . '-' . $arr_datum[ 0 ];
}
Jetzt kannst du die Daten nach $arr_filme[][ 'Datum' ] sortiert ausgeben. Ich find den Weg aber wie gesagt recht umständlich. Vor allem muss das Datum im Dateinamen immer das gleiche Format haben. Die bessere Lösung wäre sicher, das Datum bei einlesen des Ordners in der Datenbank zu speichern. So muss dieses nur dann "herausgelöst" werden und nicht jedes mal, wenn die Filme angezeigt werden.
 
Danke werd das jetzt einmal testen.

Das Problem ist, dass das vorige Script immer den aktuellen Ordner ausgelesen hat und dann sortiert. Da war dann bei 100 User gleichzeitig dann Schluss, einfach zu viel Belastung. Ich arbeite gerade wie gesagt an einer Datenbanklösung um viel weniger Recourcen zu verbrauchen.

Ich werd das jetzt einmal testen und sehen ob es funktioniert.

grüße strex
 
PHP:
<?

$DatabasePointer=mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword); 
mysql_select_db($Database); 

//Daten werden ausgelesen und ausgegeben
$sql = "SELECT Dateiname, Dateigroesse, date, Link FROM otrkey";
$ergebnis = mysql_query($sql, $DatabasePointer);

while ( $satz = mysql_fetch_assoc( $ergebnis ) ) 
{
    $arr_filme[][ 'Dateiname' ] = $satz[ 'Dateiname' ];
    $arr_filme[][ 'Dateigroesse' ] = $satz[ 'Dateigroesse' ];
    $arr_filme[][ 'date' ] = $satz[ 'date' ];
    $arr_filme[][ 'Link' ] = $satz[ 'Link' ];
} 

$arr_filme_count = count( $arr_filme );
for( $i = 0 ; $i < $ar_filme_count ; $i++ )
{
    preg_match( '/REGEXFÜR TT.MM.JJJJ/' , $arr_filme[ $i ][ 'Dateiname' ] , $datum );
    $arr_datum = explode( '.' , $datum[ 1 ] ); // Je nach Aufbau des RegEx kann das auch $datum[ 2 ] / $datum[ n ] sein.
    $arr_filme[ $i ][ 'Datum' ] = $arr_datum[ 2 ] . '-' . $arr_datum[ 1 ] . '-' . $arr_datum[ 0 ];
}   

mysql_close(); 

?>

Hab das jetzt ,mal so versucht. Scheint aber nicht zu funktionieren. Weiß einer einen rat?

grüße strex
 
Zurück