Announcement

Collapse
No announcement yet.

InternetFindNextFile - Die Verzeichnisse auf einem Webserver bestimmen...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • InternetFindNextFile - Die Verzeichnisse auf einem Webserver bestimmen...

    Hallo zusammen,

    Ich habe folgenden Wunsch:

    <B>Ich möchte wissen, welche Verzeichnisse sich hinter einer URL noch verstecken!</B>

    Mit InternetOpenUrl öffne ich eine Verbindung meinetwegen zu www.microsoft.com, dies funktioniert auch. dann übergebe ich das damit erzeugte Handle an <B>InternetFindNextFile</B> welche mir dann die unter dieser URL zu findenden Verzeichnisse auflisten sollte.
    Aber ich erhalte jedesmal mit GetLastError 12016 ($2EF0), dieser Code ist nirgendwo erwähnt.

    Wie komme ich nun an die Verzeichnisse ran? Im SDK steht dazu dass das mit InternetOpenURL funzen sollte.

    ciao Elerian

  • #2
    Hallo,

    in einfachsten Fall erlaubt der <b>Microsoft OLE DB Provider for Internet Publishing</b> (Provider=MSDAIPP.DSO) den direkten Zugriff auf eine Webseite (URL) über die ADO-Komponenten. Der Provider betrachtet dabei die Webseite als Datenbank. Das folgende Beispiel demonstriert, wie alle Verzeichnisse und Dateien angezeigt und der Inhalt direkt über ADO ausgelesen werden kann:
    <pre>
    { ************************************************** *******************
    Autor : Andreas Kosch
    Compiler : Delphi 5 UpdatePack#1 / Delphi 6.01 Enterprise
    Betriebssystem : Windows 2000 / Windows XP Professional
    Datum : 20.09.2000 / 09.12.2001
    Beschreibung : ADO 2.5 / 2.7
    Beispiel für den Einsatz des Record- und
    Stream-Objekts von ADO 2.5/2.7
    Dateien aus dem URL-Verzeichnis auslesen und
    Dateiinhalt über Stream anzeigen
    ************************************************** ******************** }

    unit ADORecordFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ComCtrls, StdCtrls, DB, ADODB, ADODB_TLB;

    type
    TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    Label1: TLabel;
    EditURL: TEdit;
    ButtonOpen: TButton;
    ListBoxFiles: TListBox;
    MemoFile: TMemo;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    procedure ButtonOpenClick(Sender: TObject);
    procedure ListBoxFilesClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    FRecord : _Record;
    FRecordSet : _Recordset;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    {$IFDEF VER140} uses Variants; {$ENDIF}

    procedure TForm1.ButtonOpenClick(Sender: TObject);
    var
    vURL : OleVariant;
    begin
    vURL := 'URL=' + EditURL.Text;
    // Instanz des Record-Objekts anfordern
    FRecord := CoRecord_.Create;
    FRecord.Open(EmptyParam, vURL, adModeUnknown,
    adOpenIfExists OR adCreateCollection,
    adOpenRecordUnspecified, '', '');
    // Record-Objektinstanz liefert Interface-Zeiger auf RecordSet zurück
    FRecordSet := FRecord.GetChildren;
    while not FRecordSet.EOF do
    begin
    ListBoxFiles.Items.Add(FRecordSet.Fields[0].Value);
    FRecordSet.MoveNext;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    vURL : OleVariant;
    begin
    ADOConnection1.Connected := True;
    // Instanz des Record-Objekts anfordern
    FRecord := CoRecord_.Create;
    FRecord.Open(EmptyParam, ADOConnection1.ConnectionObject, adModeUnknown,
    adOpenIfExists OR adCreateCollection,
    adOpenRecordUnspecified, '', '');
    // Record-Objektinstanz liefert Interface-Zeiger auf RecordSet zurück
    FRecordSet := FRecord.GetChildren;
    while not FRecordSet.EOF do
    begin
    ListBoxFiles.Items.Add(FRecordSet.Fields[0].Value);
    FRecordSet.MoveNext;
    end;
    end;

    procedure TForm1.ListBoxFilesClick(Sender: TObject);
    var
    sFile : String;
    aStream : _Stream;
    aRecord : _Record;
    begin
    // zur Kontrolle in der Statusbar anzeigen
    sFile := ListBoxFiles.Items[ListBoxFiles.ItemIndex];
    StatusBar1.Panels[0].Text := sFile;
    // ausgewählten Eintrag im Recordset positionieren
    FRecordSet.MoveFirst;
    FRecordSet.Move(ListBoxFiles.ItemIndex, EmptyParam);
    // Recordset-Details anzeigen
    StatusBar1.Panels[1].Text := Format('Stream size: %s',
    [VarToStr(FRecordSet.Fields[11].Value)]);
    StatusBar1.Panels[2].Text := Format('Pfad: %s',
    [VarToStr(FRecordSet.Fields[2].Value)]);
    // Instanz des Record-Objekts anfordern
    aRecord := CoRecord_.Create;
    // Daten aus dem aktuellen RecordSet-Datensatz laden
    aRecord.Open(FRecordSet, EmptyParam, adModeUnknown,
    adOpenIfExists, adOpenRecordUnspecified,
    '','');
    // Dateiinhal als Stream-Objekt herunterladen
    aStream := CoStream.Create;
    aStream.Open(aRecord, adModeRead, adOpenStreamFromRecord, '', '');
    aStream.Type_ := adTypeText;
    aStream.CharSet := 'ascii';
    MemoFile.Text := aStream.ReadText(adReadAll);
    aStream.Close;
    end;

    end.
    </pre&gt

    Comment


    • #3
      Aber woher bekomme ich das _Record-Objekt? Es ist wird nirgendwo definiert. _RecordSet konnte ich finden.

      Aber _Record bei ADO?

      ciao Eleria

      Comment


      • #4
        Hallo,<br>Das _Record Objekt erhälst Du, wenn Du die ADO Typebibliothek importierst.<br>Jens Schuman

        Comment


        • #5
          Hallo Andreas,<br>
          ich verwende D5 Pro , MDAC 2.6 und Win2k SP2.
          Die DFÜ-Verbindung ist aktive<br>
          Jetzt habe ich versucht Dein Beispiel auszuprobieren. Aber ich bin gescheitert.<br>
          Im ButtonOpen Event erhalte ich in der Zeile<br>
          FRecord.Open(EmptyParam,vURL, adModeUnknown, adOpenIfExists OR adCreateCollection, adOpenRecordUnspecified, '', '');<br>
          die Fehlermeldung "Unbekannter Fehler". vURL enthält URL=http://www.entwickler.com . Was mache ich falsch.<br>
          Jens Schumann<br>
          <br&gt

          Comment


          • #6
            Auf diesen Fehler bin ich auch gerade gestossen.

            ciao Eleria

            Comment


            • #7
              Hallo Elerian<br>
              ich glaube, dass ich das Problem gelöst habe. Es ist ein Rechte-Problem.<br>
              Auf einem meiner NT-Rechner habe den PWS 4.0 installiert und die Sache damit getestet.<br>
              Wenn "Jeder" in der Webroot Verzeichnisberechtigung eingetragen ist, erhalte ich die o.s. Fehlermeldung.<br>
              Wenn ich "Jeder" aus der Verzeichnisberechtigung heraus nehme, erhalte ich einen Dialog für Benutzername<br>
              und Paßwort. Wenn ich irgendeinen Benutzer nehme, erhalte ich ebenfalls o.s. Fehlermeldung.<br>
              Wenn der Benutzer aber Adim-Rechte hat, dann flutscht die Sache prima.<br>
              Jens Schumann<br&gt

              Comment


              • #8
                Hallo,

                man kann die Zugangsdaten (<b>UserID</b> und <b>Password</b>) für den Zugriff auf das Webverzeichnis) auch direkt in TADOConnection eintragen. Dann kommt beim Öffnen keine Passwortabfrage mehr:
                <pre>
                object ADOConnection1: TADOConnection
                Connected = True
                ConnectionString =
                'Provider=MSDAIPP.DSO.1;Data Source=http://192.168.10.2;Bind Flag' +
                's=0;Mode=Read;Lock Owner="";Url Encoding=10;User ID=Administrato' +
                'r;Password=xyz;Ignore Cached Data=False;Cache Aggressively=Fa' +
                'lse;Treat As Offline=False;Mark For Offline=0;Protocol Provider=' +
                '{00000000-0000-0000-0000-000000000000};Flush WinInet Password Ca' +
                'che=False;User Agent string="";Custom Http Headers="";Use Cached' +
                ' DAV lock Token=False;Bypass LIS for Invoke command=False;Dump X' +
                'ML response form command execution=False;Supress resource column' +
                's in command result=False;Show thicket files for WEC server=Fals' +
                'e'
                ConnectionTimeout = 0
                LoginPrompt = False
                Mode = cmRead
                Provider = 'MSDAIPP.DSO.1'
                Left = 384
                Top = 8
                end
                </pre&gt

                Comment


                • #9
                  Hallo,

                  Damit kann man über die ADO also Verzeichnisse auf Webservern auslesen, wenn die entsprechenden Server dies unterstützen und man entsprechende Zugriffsrechte hat.

                  Gibt es nun noch einen anderen Weg (zb bei Netware-Servern, oder Servern ohne Frontpage 2000 Erweiterung)?

                  Über FTP sollte dies funktionieren, dafür wurde das Protokoll auch geschaffen, aber über HTTP ist dies doch eigentlich nicht zulässig, oder?

                  ciao Eleria

                  Comment


                  • #10
                    Hi,

                    Ich hab dieses Beispiel auch ausprobiert, Leider bekomme ich ich auch nur die Fehlermeldung:
                    Eine Verbindung mit dem Server kann für diese URL nicht hergestellt werden.

                    ich ADO Typ Bibliothek 2.7 importiert und benutze Delphi 5.0 mit SP 1.

                    Pete

                    Comment

                    Working...
                    X