Hannes: dateienspeichern in unterverzeichnissen

Hallo,

mit folgendem Skript will ich Daten in eine neu einzurichtende Datei in ein Unterverzeichniss speichern.

Die klappt jedoch nur auf erster ebene (../verzeichnis1/datei.txt), nicht eine ebene tiefer (../verzeichnis1/verzeichnis2/datei.txt)

Es handelt sich um einen Unix Server, auf dem folgendes Skript (z.B. läuft:

#!/usr/bin/perl -w
use strict;
use vars qw/$globalpfad %schonangezeigt $kopfschonangezeigt $fehlerseite %INPUT @datensatz/;
print "Content-type: text/html\n\n";

open(DATEI, ">../verz1/verz2/test.txt") || die "Datei  wurde nicht gefunden!!!";
#in verz1 kann ich speichern, in verz2 nicht!
 my $lockedfile="true";
 if ($lockedfile)
  {flock(DATEI, $lockedfile);}
 print DATEI 'ein blöder Text für eine blöden Test';
close(DATEI);

print "Der Text wurde ausgegeben";

  1. Moin!

    Die klappt jedoch nur auf erster ebene (../verzeichnis1/datei.txt), nicht eine ebene tiefer (../verzeichnis1/verzeichnis2/datei.txt)

    Hast Du Schreibrechte?

    #!/usr/bin/perl -w
    use strict;

    Schonmal sehr gut! Sieht man viel zu selten.

    open(DATEI, ">../verz1/verz2/test.txt") || die "Datei  wurde nicht gefunden!!!";

    Gut ist, dass Du ueberhaupt auf den Fehlerfall eingehst. Schlecht ist, dass Deine Fehlermeldung nicht gerade das Attribut "sinnvoll" verdient. Nimm stattdessen besser sowas:

    my $filename = "../verz1/verz2/test.txt";
    open(DATEI, ">$filename") || die("Can't open $filename for writing because: $!";

    Achte vor allem auf die Variable $!, die sagt Dir naemlich, was das denn fuer ein Fehler war, der aufgetreten ist. Wenn Du dann also eine vernuenftige Fehlermeldung hast, wirst Du das Problem sicher ohne weiteres loesen koennen.

    #in verz1 kann ich speichern, in verz2 nicht!
    my $lockedfile="true";
    if ($lockedfile)
      {flock(DATEI, $lockedfile);}

    Dieser Code ist in dieser Form ziemlich sinnbefreit.

    print DATEI 'ein blöder Text für eine blöden Test';
    close(DATEI);

    Hier noch Fehlerfall abfangen und je nachdem, wie es im Script weitergeht, entweder 'die' verwenden (wie oben bei open) oder nur eine Fehlermeldung ausgeben und weitermachen. Letzterer Fall ginge so:

    close(DATEI) or print STDERR "Failed to close $filename because: $!\n";

    So long

    1. Hallo!

      Hast Du Schreibrechte?

      Alle da. Klappt ja auch im Verzeichnis, nur im Unterverzeichnis nicht.

      #!/usr/bin/perl -w
      use strict;
      Schonmal sehr gut! Sieht man viel zu selten.

      Na, bei derart guten Tutoren wie Dir!!!

      my $lockedfile="true";
      if ($lockedfile)
        {flock(DATEI, $lockedfile);}
      Dieser Code ist in dieser Form ziemlich sinnbefreit.

      Ich wollte nur, das diese Datei nicht zweimal zum schreiben geoeffnet ist - und in slefhtml hab ich das dazu gefunden.
      wenn ich nicht "true" zuweise geht irgendwie nix...

      Also: stand der DInge ist: bei untenstehendem Skript gibt er wie gehabt auf erster ebene ein ergebnis aus, auf zweiter Verzeichnisebene nix (also nichtmal eine fehlermeldung).
      Oder werden die Fehlermeldungen irgendwo anders gespeichert (Es findet sich keine error.txt auf dem Server)???

      Das Skript sieht derzeit wie folgt aus:

      #!/usr/bin/perl -w
      use strict;

      print "Content-type: text/html\n\n";

      my $filename="../data/news/tost.txt";

      wahlweise $filename="../data/tost.txt"; - dann geht es problemlos

      open(DATEI, ">".$filename) || die "Cant open $filename because of: $! ";
       my $lockedfile="true";
       if ($lockedfile)
        {flock(DATEI, $lockedfile);}

      print DATEI 'ein blöder Text für eine blöden Test';
      close(DATEI) or print STDERR "Failed to close $filename because: $! \n";

      print "Der Text wurde ausgegeben";

      1. Also: stand der DInge ist: bei untenstehendem Skript gibt er
        wie gehabt auf erster ebene ein ergebnis aus, auf zweiter
        Verzeichnisebene nix (also nichtmal eine fehlermeldung).
        Oder werden die Fehlermeldungen irgendwo anders gespeichert
        (Es findet sich keine error.txt auf dem Server)???

        http://theoryx5.uwinnipeg.ca/CPAN/data/CGI-modules/CGI/Carp.html#MAKING_PERL_ERRORS_APPEAR_IN_THE_BROWSER_WINDOW

      2. Hi again!

        Na, bei derart guten Tutoren wie Dir!!!

        Haha, Du willst wohl, dass ich rot werde? Naja, hat geklappt. ;-)

        my $lockedfile="true";
        if ($lockedfile)
          {flock(DATEI, $lockedfile);}
        Dieser Code ist in dieser Form ziemlich sinnbefreit.
        Ich wollte nur, das diese Datei nicht zweimal zum schreiben geoeffnet ist - und in slefhtml hab ich das dazu gefunden.
        wenn ich nicht "true" zuweise geht irgendwie nix...

        Also ich weiss jetzt auf Anhieb auch nicht, wie's richtig geht - so wie oben jedenfalls nicht. Lies Dir auf jeden Fall mal die Doku zu flock durch, also
          perldoc -f flock
        Evtl. stellst Du die Frage nochmal separat, oder schaust mal im Archiv nach, da muesste auch einiges stehen.

        Also: stand der DInge ist: bei untenstehendem Skript gibt er wie gehabt auf erster ebene ein ergebnis aus, auf zweiter Verzeichnisebene nix (also nichtmal eine fehlermeldung).
        Oder werden die Fehlermeldungen irgendwo anders gespeichert (Es findet sich keine error.txt auf dem Server)???

        Klingt, wie wenn Du das Script ueber den Browser aufrufst. Ja, dann werden die die-Meldungen und das, was print STDERR ausgibt, *nicht* an den Browser gesendet, sondern ins Errorlog des Webservers. (Wo das wiederum ist, musst Du den Provider fragen.)

        Falls Du telnet-Zugang hast, starte das Script einfach von der Kommandozeile, dann erscheinen die Fehlermeldungen dort direkt. Oder schau bei des Linken Setzers Link, wie man die Meldungen doch noch zum Browser geschickt bekommt.

        So long

        1. heda

          dank euch nochmal  für die Antworten. ich probier das morgen mal aus - melde mich dann hoffentlich nicht mehr :-)

          Hannes