tkm: "opendir" Problem

Hallo Zusammen

Ich habe folgendes Problem: Ich rufe mit der Funktion "opendir" ein Verzeichnis auf und möchte alle htm-Dateien
auflisten. Das Problem ist, dass ich das Verzeichnis von einem externen Server einelsen muss. Also der Pfad
wäre dann (http://www.url.com/verzeichnis/a/) da bekomme ich aber immer folgender Error:

http://www.url.com/verzeichnis/a/: No such file or directory at c:\inetpub\scripts\tone.pl line 61.

Wenn ich aber ein Verzeichis von meinem Server einbeziehe (../html/verzeichnis/a/) funktioniert alles bestens.

Gibt es da eine Lösung???

Hier noch den Script-Auszug:

--snip--

sub dir {

opendir(DIR, $dir) || die "$dir: $!";
@result = readdir(DIR);
closedir(DIR);

$i = 0;

foreach(@result)
 {

if($_ =~ /.+.htm*/)

{
  $i++;
  $_=~s/$dir//g;
  $data=$_;
  $data=~ s/ /\*/g;
  push(@tone,"<a href="$cgi?act=dwn&dir=$page&file=$data" style="text-decoration: none">$_</a><br>\n");
  }

}
}

--snip--

  1. Hallo,

    Ich habe folgendes Problem: Ich rufe mit der Funktion "opendir" ein Verzeichnis auf und möchte alle htm-Dateien
    auflisten. Das Problem ist, dass ich das Verzeichnis von einem externen Server einelsen muss. Also der Pfad
    wäre dann (http://www.url.com/verzeichnis/a/) da bekomme ich aber immer folgender Error:
    http://www.url.com/verzeichnis/a/: No such file or directory at c:\inetpub\scripts\tone.pl line 61.

    Lokale Dateisysteme und Netzwerkdienset ( wie z.B. ein Webserver) sind zwei vollkommen verschiedene Dinge. opendir (und readdir) ist eine Funktion, welche ausschließlich mit Dateisystemen benutzt werden kann. Willst Du auf Daten von einem Webserver zugreifen, dann benötigst Du auch andere Funktionen (die z.B. über ein Modul aus der LWP-Sammlung eingebunden werden können). Allerdings ist ein Zugriff auf ein 'Verzeichnis' eines Webserveres auch nicht so einfach, da dieser nicht unbedingt alle dort abgelegten Dateien preisgibt, und wenn, dann per HTML-Dokument, welches dann noch geparst werden muß.

    Wenn ich aber ein Verzeichis von meinem Server einbeziehe (../html/verzeichnis/a/) funktioniert alles bestens.

    Gibt es da eine Lösung???

    Wenn Du auf die Daten eines anderen Rechners mit den gleichen Mitteln zugreifen willst, wie auf die lokalen, so geht das nur über Anbindungen wie NetBIOS/SMB (das z.B. in der Windows-Welt für 'Netzlaufwerk verbinden' verwendet wird), oder NFS (Network File System, wird in der Unix-Welt oft eingesetzt). Das setzt allerdings auf dem anderen Rechner die entsprechenden Dienste und für Dich die entsprechenden Zugangsberechtigungen voraus.  Alternativ kannst Du auch per FTP zugreifen, was allerdings wieder ein eigens Protokoll ist, und Du auch hier die nötigen Rechte brauchst.

    Vielleicht wäre es aber gleich einfacher, das entsprechende Script auf dem anderen Webserver zu installieren, damit Du nicht so mit der Kirche ums Kreuz herum arbeiten mußt.

    Grüße
      Klaus

    1. Hallo,

      Ich habe folgendes Problem: Ich rufe mit der Funktion "opendir" ein Verzeichnis auf und möchte alle htm-Dateien
      auflisten. Das Problem ist, dass ich das Verzeichnis von einem externen Server einelsen muss. Also der Pfad
      wäre dann (http://www.url.com/verzeichnis/a/) da bekomme ich aber immer folgender Error:
      http://www.url.com/verzeichnis/a/: No such file or directory at c:\inetpub\scripts\tone.pl line 61.

      Lokale Dateisysteme und Netzwerkdienset ( wie z.B. ein Webserver) sind zwei vollkommen verschiedene Dinge. opendir (und readdir) ist eine Funktion, welche ausschließlich mit Dateisystemen benutzt werden kann. Willst Du auf Daten von einem Webserver zugreifen, dann benötigst Du auch andere Funktionen (die z.B. über ein Modul aus der LWP-Sammlung eingebunden werden können). Allerdings ist ein Zugriff auf ein 'Verzeichnis' eines Webserveres auch nicht so einfach, da dieser nicht unbedingt alle dort abgelegten Dateien preisgibt, und wenn, dann per HTML-Dokument, welches dann noch geparst werden muß.

      Wenn ich aber ein Verzeichis von meinem Server einbeziehe (../html/verzeichnis/a/) funktioniert alles bestens.

      Gibt es da eine Lösung???

      Wenn Du auf die Daten eines anderen Rechners mit den gleichen Mitteln zugreifen willst, wie auf die lokalen, so geht das nur über Anbindungen wie NetBIOS/SMB (das z.B. in der Windows-Welt für 'Netzlaufwerk verbinden' verwendet wird), oder NFS (Network File System, wird in der Unix-Welt oft eingesetzt). Das setzt allerdings auf dem anderen Rechner die entsprechenden Dienste und für Dich die entsprechenden Zugangsberechtigungen voraus.  Alternativ kannst Du auch per FTP zugreifen, was allerdings wieder ein eigens Protokoll ist, und Du auch hier die nötigen Rechte brauchst.

      Vielleicht wäre es aber gleich einfacher, das entsprechende Script auf dem anderen Webserver zu installieren, damit Du nicht so mit der Kirche ums Kreuz herum arbeiten mußt.

      Grüße
        Klaus

      Hallo Klaus

      Kannst du mir konkret sagen mit welchen Modulen ich da arbeiten müsste.
      Ich muss leider diesen umweg machen, da ich eine sehr umfangreiche Datei-
      Sammlung aus Kostengründen auf einen Freespace ausgelagert habe. Leider
      habe ich da keine CGI-Verzeichnis. Der Server erlaubt Verzeichnis Listing
      also wenn ich mein Verzeichnis aufrufe listet er mir alles auf was drin ist
      (solange keine index.html existiert).
      Also musste ein Externer Scriptaufruf möglich sein, glaube ich...

      Ein kleines Beispiel-Script wäre nett. Danke für deine Hilfe.

      Grüsse tkm

      1. Hallo,

        schön ist es absolut nicht, aber so kommst Du jedensfalls an die Daten:

        use LWP::Simple;
        $content = LWP::Simple::get("http://www.url.com/verz/a/");

        Manfred

        1. Danke für eure Tips.

          Werde mich mal mit LWP::Simple anfreunden. Die Text-Dateilösung
          ist für mich nicht wirklich praktisch, da die Inhalte des Verzeichnis
          relativ oft ändern (nicht nur eine Datei). Deshalb möchte ich ja auch das
          Verzeichnis einlesen.

          Viele Grüsse

          tkm

          1. Hallo,

            Werde mich mal mit LWP::Simple anfreunden. Die Text-Dateilösung
            ist für mich nicht wirklich praktisch, da die Inhalte des Verzeichnis
            relativ oft ändern (nicht nur eine Datei). Deshalb möchte ich ja auch das
            Verzeichnis einlesen.

            Naja, wie Du willst. Aber wenn Du die Inhalte oft änderst, könntest Du ja auch ein (lokal laufendes Nicht-CGI)-Script schreiben, daß Dir die Links checkt, eine Verzeichnisliste anlegt, und dann noch alle geänderten Daten automatisch auf den Server spielt. Dann ist die Investition in einem Offline-Script gut angelegt, und als 'Nebeneffekt' sparst Du Dir den unnötigen Traffic zwischen den zwei Servern, und bist ausserdem noch wesentlich krisensicherer, bzw. auch flexibler.

            Aber jeder wie er will;-)

            Grüße
              Klaus

      2. Hallo,

        Zu allererst möchte ich Dich darauf hinweisen, daß Du nur die Teile des ausgangspostings stehen lassen solltest (zitierst), auf die Du Dich konkret beziehen willst. Näherest findest Du in den Forums-FAQ.

        Ich muss leider diesen umweg machen, da ich eine sehr umfangreiche Datei-
        Sammlung aus Kostengründen auf einen Freespace ausgelagert habe.

        Dann hast Du ja den Inhalt des fremden Servers unter Kontrolle. Das bedeutet, Du könntest auch eine Textdatei, oder mehrere, erstellen, welche sämtliche Dateien des anderen Servers beinhaltet. Diese Datei für die auszulesen und in eine entsprechende Ausgabe umzuwandeln dürfte einfacher und auch schneller sein, als jedesmal per HTTP-Zugriff ein 'Verzeichnis' einzulesen und dann erst darzustellen.

        Die Dateien kannst Du dann per Link direkt ansprechen.

        Ach ja, ein Modul, welches Du für HTTP-Zugriffe verwenden kannst ist LWP::Simple, zu finden in der libwww (http://search.cpan.org/search?dist=libwww-perl). Einen guten Einstieg bietet http://search.cpan.org/doc/GAAS/libwww-perl-5.64/lwpcook.pod.

        Ein kleines Beispiel-Script wäre nett. Danke für deine Hilfe.

        use LWP::Simple;
        my $dokument_inhalt = get 'http://wo.auch.immer/was/auch/immer/';

        Wobei ich das trotzdem nicht für die Verzeichnisverwaltung nehmen würde;-)

        Grüße
          Klaus