Thread Verzeichnis rekursiv auslesen und in Datenbank schreiben (39 answers)
Opened by Anton at 2012-05-15 08:38

GwenDragon
 2012-05-15 09:09
#158359 #158359
User since
2005-01-17
14544 Artikel
Admin1
[Homepage]
user image
Ich weiß ja nicht, was du alles schon kannst in Perl, welches Wissen du hast.

Was du mit
Quote
parent id..
meinst, verstehe ich nicht. Erkläre das doch bitte näher.

Für das rekursive Auslesen von Verzeichnissen gibt es das Modul CPAN:File::Find und für die Datenbank CPAN:DBI.

Folgendes Beispielskript DateiInDatenbank.pl zeigt, wie ein Verzeichnis eingelesen werden kann und die gefundenen Dateien in eine Datenbank gespeichert werden:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use DBI;

# Verzeichnis von Kommandozeile holen
my $verzeichnis = shift(@ARGV) || '.'; 

# Array für die gefundenen Dateien
my @dateien; 

# Routine, die Dateien findet
sub wanted { 
  push @dateien,$File::Find::name    # schiebe Dateinamen in Array
    if $File::Find::name ne "."      # wenn Datei ist nicht aktuelles Verzeichnis
    and $File::Find::name ne ".."    #      Datei ist nicht übergeordenetes Verzeichnis
    and -f $File::Find::name;        #      Dateiname ist eine Datei     
}
# Suche nach Dateien starten
find(\&wanted,  $verzeichnis); 

my $datenbank = 'meinedateidb';  # Name der MySQL-Datenbank
my $tabelle = 'Dateien';         # Name der Tabelle in der DB
my $spaltenname = 'Dateiname';   # Name der Spalte in der Tabelle

my $dsn = "dbi:mysql:$datenbank"; 

# zu Datenbank verbinden
my $dbh = DBI->connect( $dsn, "LoGiNNuTzErNaMe", "geHeImP455w0r7" );

# SQL vorbereiten
my $sth = $dbh->prepare( q{INSERT INTO ? (?) VALUES (?);} );

# in Schleife Dateinamen aus Array holen
for my $dateiname (@dateien) {
  # und SQL ausführen und Daten in Datenbank schreiben
  $sth->execute($tabelle, $spaltenname, $dateiname);
}

# von Datenbank abmelden
$dbh->disconnect();

1;


Aufrufen kannst du dein Programm dann so:

DateiInDatenbank.pl /home/meinverzeichnis/

Wenn bei Datenbankproblemen sofort mit einer Meldung abgebrochen werden soll, dann ersetze im Programm die Zeile
Code (perl): (dl )
my $dbh = DBI->connect( $dsn, "LoGiNNuTzErNaMe", "geHeImP455w0r7" );
durch
Code (perl): (dl )
my $dbh = DBI->connect( $dsn, "LoGiNNuTzErNaMe", "geHeImP455w0r7", { RaiseError => 1 } );



//EDIT: Test auf Dateinamen in wanted umgestellt
Tippfehler in DSN geändert
Hinweis auf Abbruch bei erstem DB-Fehler
Last edited: 2012-05-15 09:43:05 +0200 (CEST)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

View full thread Verzeichnis rekursiv auslesen und in Datenbank schreiben