Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10604[/thread]

Fragen zu Net::FTP

Leser: 3


<< >> 8 Einträge, 1 Seite
MechaTikal
 2007-10-17 18:34
#100987 #100987
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe ein Skript geschrieben, das sich auf einen FTP-Server verbindet und Dateien herunterladen soll. Voraussetzung dafür ist, dass es zu jeder Datei auch eine Flagdatei gibt, die anzeigt, dass das Original fertig hochgeladen ist. Also beispielsweise irgendwas.txt und irgendwas.txt.flag. Ich hab jetzt einen Hash gebastelt - Schlüssel ist das Original, Wert ist das Flagfile. Erste Frage:
Kann ich mit folgendem Code garantieren, dass zu jeder Datei die richtige Flagdatei gefunden wird? Ich frage, weil auf dem Testserver die Dateien geordnet sind, so dass die passenden Dateien eh untereinander liegen. Es funktioniert zwar, aber ich kann nicht garantiert sagen, dass es auch bei zufälliger Anordnung klappt.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $flag = ".flag";
foreach my $file(@files) {
        if ($file !~ /$flag$/) {           
            print "$file\n";        
            $edifile = $file;       

        }
        my $search = "$edifile" . "$flag";
        print "gesucht wird: $search\n";
        if ($file =~ /$search$/) {
            $donefile = $file;      
            $filehash{$edifile} = $donefile;
        }
    }


Zweite Frage:
Code (perl): (dl )
1
2
3
4
        
my $store_directory = "./store";

$ftp->get($edi, $edi, $store_directory) or die "Could not download $edi: $!";

Da wüsst ich gern, warum die Dateien nicht im angegebenen Ordner, sondern im aktuellen Verzeichnis ankommen. Was mach ich denn da falsch?
renee
 2007-10-17 19:41
#100988 #100988
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nein, rein theoretisch könnte es passieren, dass eine zweite "Nicht-Flag"-Datei das $edifile überschreibt, ohne dass Du was im Hash gespeichert hast...

Ich würde es eher so machen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my %hash;
my $flag = ".flag";

foreach my $file(@files) {
    if ($file !~ /\Q$flag$/) {           
        print "$file\n";          
        $hash{$file} = $file . $flag;
    }
}


Damit würdest Du auch Dateien bekommen, für die (noch) keine .flag-Datei existiert. Wenn Du das nicht haben möchtest, kannst Du es auch so machen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my %hash;
my $flag = ".flag";

foreach my $file(@files) {
    if ($file !~ /\Q$flag$/) {           
        print "$file\n";          
        $hash{$file} = 0;
    }
    else{
        my ($short = $file) =~ s!$flag$!!;
        $hash{$short}++;
    }
}

%hash = map{ $_ => $_ . $flag }grep{ $hash{$_} }keys %hash;
(ungetestet)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-10-17 19:46
#100989 #100989
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
MechaTikal+2007-10-17 16:34:35--
Zweite Frage:
Code (perl): (dl )
1
2
3
4
        
my $store_directory = "./store";

$ftp->get($edi, $edi, $store_directory) or die "Could not download $edi: $!";

Da wüsst ich gern, warum die Dateien nicht im angegebenen Ordner, sondern im aktuellen Verzeichnis ankommen. Was mach ich denn da falsch?


Wie kommst Du darauf, dass der dritte Parameter das Zielverzeichnis ist?

Aus der Doku:
Quote
get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )

Get REMOTE_FILE from the server and store locally. LOCAL_FILE may be a filename or a filehandle. If not specified, the file will be stored in the current directory with the same leafname as the remote file.

If WHERE is given then the first WHERE bytes of the file will not be transferred, and the remaining bytes will be appended to the local file if it already exists.


Du solltest mal $ftp->get($edi, $store_directory . $edi) ausprobieren... (ungetestet)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
MechaTikal
 2007-10-18 10:58
#100999 #100999
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
renee+2007-10-17 17:46:00--


Wie kommst Du darauf, dass der dritte Parameter das Zielverzeichnis ist?

Aus der Doku:
Quote
get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )

Get REMOTE_FILE from the server and store locally. LOCAL_FILE may be a filename or a filehandle. If not specified, the file will be stored in the current directory with the same leafname as the remote file.

If WHERE is given then the first WHERE bytes of the file will not be transferred, and the remaining bytes will be appended to the local file if it already exists.


Gute Frage. Ich weiss auch nicht, wie ich darauf gekommen bin... (Notiz an mich selbst: Erst lesen, dann Fragen stellen!)
Dein Vorschlag mit dem Hash muss ich ausprobieren. Was bedeutet denn \Q im regulären Ausdruck? Hab das zugegebenermaßen noch nie vorher gesehen.
renee
 2007-10-18 11:45
#101000 #101000
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Damit werden RegEx-Sonderzeichen "escaped". Dazu auch ganz lehrreich: http://board.perl-community.de/thread/10605/#MSG4
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
MechaTikal
 2007-10-18 14:13
#101007 #101007
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
        
my $store_directory = "/store/";

$ftp->get($edi,  $store_directory. $edi) or die "Could not download $edi: $!";

Fehlermeldung:
Cannot open Local file /store/ABC.EDI: Datei oder Verzeichnis nicht gefunden
at ./ftpaddon_1.0.pl line 177
Could not download ABC.EDI: at ./ftpaddon_1.0.pl line 177, <IN> line 8.


Ich muss doch blöd sein... schreibe ich nur die Datei hin, holt er sie auch ab, aber eben in das Verzeichnis, von dem ich das Skript aufrufe! ("store" liegt eine Ebene darunter)
Ansonsten gibt er mir immer diese Fehlermeldung aus. Was mache ich denn falsch? :(
nepos
 2007-10-18 14:16
#101008 #101008
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielleicht solltest du den kompletten Pfad für dein store-Verzeichnis übergeben?
Oder liegt store wirklich im root-Dateisystem?
MechaTikal
 2007-10-18 14:51
#101013 #101013
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
nepos+2007-10-18 12:16:08--
Vielleicht solltest du den kompletten Pfad für dein store-Verzeichnis übergeben?
Oder liegt store wirklich im root-Dateisystem?

Argh. Ich wusste dass es wieder so ein blöder kleiner Fehler ist.
Aus "/store" hab ich "./store" gemacht und sieh da - es klappt. Danke nepos, an solchen kleinen Sachen scheiter ich leider ab und an mal.
<< >> 8 Einträge, 1 Seite



View all threads created 2007-10-17 18:34.