lokale HTML-Datei aus dem Resources-Ordner ausführen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Chefkoch.

    lokale HTML-Datei aus dem Resources-Ordner ausführen

    Hallo zusammen,
    Hello

    (first of all: Ich bin Anfänger und bitte deshalb um Verständnis, wenn es mal nicht ganz ankommt bei mir)

    wie die Überschrift bereits ahnen lässt, möchte ich eine lokal abgespeicherte Webseite mit einem Buttonclick aus meiner VB-Form ausführen lassen.
    (das ganze mit Visual Studio 2010, schreiben möchte ich mit/in einer VB-Form)

    Mir ist bewusst, wie ich irgendeine html-Datei aus C:\..... öffne bzw ausführe.
    (Process.Start(...))

    Ich möchte aber die Files der abgespeicherten Webseite inkl. .jar-files, die ggf. enthalten sind, in den Resources-Ordner kopieren(was ich bereits getan habe) und von dort aus ausführen.

    Ich möchte, dass die offline-Seite mit den darin enthaltenen Applets etc. auch ausführbar sind, wenn ich die .exe-Datei aus Visual Basic auch auf meinen anderen Rechnern oder auf dem USB-Stick laufen, ohne dass ich ständig den Pfad der Dateien verändern muss, bzw die Dateien separat kopieren muss.

    Ich hoffe, dass es nicht zu verwirrend erklärt ist.
    Aus den Resourcen selbst lässt sich nichts ausführen. Du musst die Dateien aus den Resourcen auf den Computer kopieren und kannst dann alles damit anstellen, was du willst.
    Das geht zum Beispiel so:

    VB.NET-Quellcode

    1. System.IO.File.WriteAllBytes("FILE.DLL", My.Resources.FILE)


    edit: Normalerweise würde man sowas in den AppData Ordner extrahieren/kopieren. Aber wenn du darauf nicht immer Zugriff hast, kannst du, indem du, wie im Beispielcode, nur den Dateinamen angibst, die Datei auch in den gleichen Ordner wie dein Programm extrahieren. Beim Schließen deines Programms solltest du ggf die Dateien wieder löschen

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Also hieß es für eine konkrete .htm-Datei (z.B. hello.htm)
    System.IO.FILE.WriteAllBytes("FILE.DLL", My.Resources.hello)
    (sorry...)
    ??
    Was ist nun mit der Datei geschehen und wie rufe ich die Datei nun zum ausführen auf?

    wie gesagt, bin ziemlich schwach in diesen Dingen

    Angenommen, ich habe mit dem obigen Befehl die Datei aufgerufen. Nun scheint es so, als müsste dann mit einer Art AppData-Befehl die Datei anschließend so ausführen.

    Was meinst du mit dem anschließenden Löschen, wenn ich keinen Zugriff habe?
    Ich möchte, wenns geht nur die exe-Datei später nach überall mitnehmen und ausführen.

    Edit by Manschula: (Unnötiges) Vollzitat entfernt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Manschula“ ()

    Um die Datei ins selbe Verzeichnis wie das, von wo gerade dein Programm ausgeführt wird, zu kopieren, braucht man diesen Code:

    VB.NET-Quellcode

    1. System.IO.FILE.WriteAllBytes("hello.htm", My.Resources.hello)

    Jetzt liegt sie also im selben Ordner wie deine Exe. Also kannst du die Datei wie folgt aufrufen:

    VB.NET-Quellcode

    1. Process.Start(IO.Path.Combine(Application.StartupPath, "hello.htm"))

    Evtl wäre es nachher angebracht, diese Datei wieder zu löschen. Man will ja den PC anderer Leute nicht zumüllen:

    VB.NET-Quellcode

    1. My.Computer.FileSystem.DeleteFile(IO.Path.Combine(Application.StartupPath, "hello.htm"))



    Allerdings gibt es ja auch den Fall, dass der Anwender dein Programm auf seinen Desktop kopiert und startet. Er wird sicherlich nicht sehr erfreut sein, wenn das Programm plötzlich viele Dateien auf dem Desktop erstellt. Daher wäre wie gesagt der AppData Ordner besser.

    VB.NET-Quellcode

    1. System.IO.FILE.WriteAllBytes(IO.Path.Combine(Application.UserAppDataPath, "hello.htm"), My.Resources.hello)
    2. Process.Start(IO.Path.Combine(Application.UserAppDataPath, "hello.htm"))
    3. My.Computer.FileSystem.DeleteFile(IO.Path.Combine(Application.UserAppDataPath, "hello.htm"))


    Verstanden?

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Vielen Dank, vb-checker!

    Ich habe verstanden, was die Codes bezwecken. Und wofür sie hier jeweils eingesetzt werden. Hast du ja zum Glück so erklärt, dass ich es nicht missverstehen konnte. :)

    Ich versuche deinen Vorschlag in die Tat umzusetzen, aber ich es tritt ein Problem auf:

    "hello" ist ein Typ in "Resources" und kann nicht als Ausdruck verwendet werden.

    Deshalb konnte ich bis jetzt nichts machen.

    Oder mache ich etwas falsch?

    VB.NET-Quellcode

    1. System.IO.File.WriteAllBytes(IO.Path.Combine(Application.UserAppDataPath, "Hello.htm"), My.Resources.Hello)
    2. Process.Start(IO.Path.Combine(Application.UserAppDataPath, "Hello.htm"))
    3. My.Computer.FileSystem.DeleteFile(IO.Path.Combine(Application.UserAppDataPath, "Hello.htm"))


    Hab den Fehlerhinweis direkt unter dem letzten Buchstaben der ersten Zeile

    Erst hieß es in der Fehlermeldung: Hello ist kein Member von Resources.
    Ich habe mal auf die Option Class generieren geklickt.(das hat ein neues Tab geöffnet mit eins für Quellcodeeingabe)
    Aber die Felhermeldung änderte sich dann auf ".. Ist ein Typ in Resources und kann nicht als Ausdruck verwendet...."

    Ich muss natürlich erwähnen, dass ich die HTML-Sachen ordnerweise in den Resources-Ordner kopiert habe. Weil die Quellcodes und die .Jar files etc, die dazu gehören in den Ordnern verteilt snd.
    Habe aber die eigentlich auszuführende HTML-Datei kopiert und unmittelbar in den Resources-Ordner gelegt. Sonst ist es ja so als gäbe es die Datei nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Chefkoch“ ()

    Also die Option Klasse generieren ist falsch. Das musst du wieder rückgängig machen.

    Der Fehler liegt daran, dass du die Dateien nicht richtig in die Resourcen eingefügt hast. Du musst in den Projekteigenschaften beim Tab "Resourcen" deine Dateien hinzufügen. Hier habe ich ein passenden Bild dazu gefunden: 4.bp.blogspot.com/_s2jU7girbyM…urces+in+C#+or+VB.NET.png

    Du musst alle Dateien einzeln in die Resourcen einfügen. Ordner gehen, glaube ich, nicht. Wenn du die Dateien nachher in verschiedenen Unterordnern haben willst, musst du diese beim Kopieren aus den Resourcen auch erstellen.
    Also vor dem Kopieren dies machen:

    VB.NET-Quellcode

    1. IO.Directory.CreateDirectory(IO.Path.Combine(Application.UserAppDataPath, "Mein Unterordner"))


    Die Datei kannst du dann so darein kopieren:

    VB.NET-Quellcode

    1. System.IO.File.WriteAllBytes(IO.Path.Combine(Application.UserAppDataPath, "Mein Unterordner" & IO.Path.DirectorySeparatorChar & "Hello.htm"), My.Resources.Hello)

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Du kannst es auch als normale Datei hinzufügen, Rechtsklick auf Übersicht -> Hinzufügen.

    LG
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    gehe ganz oben auf das Menü "Projekt". Dort dann auf den Eintrag "Projektname"-Eigenschaften...

    Dann hast du links einen Tab "Resourcen". Dort gehst du auf den Pfeil neben "Resource hinzufügen" und wählst "Vorhandene Datei hinzufügen...". Dort fügst du dann allle deine Dateien hinzu. Aber nur die Dateien, weil ganze Ordner nicht gehen.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Besten Dank! Jetzt findet mans auch in der Schnellwahl bei der Code-Eingabe.

    Jetzt habe ich eine neue Fehlermeldung:
    Fehler 1 Der Wert vom Typ "String" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.
    damit ist wieder die htm-datei im resources-ordner gemeint.

    Muss eine Bearbeitung an der HTML-Datei vorgenommen werden?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Chefkoch“ ()

    Das liegt daran, dass Visual Studio die Datei als Textdatei erkennt. Du hast folgende Möglichkeiten:
    Die Datei in den Resourcen auswählen und das Eigenschaftenfenster öffnen. Dort beim Eintrag "FileType" von "Text" auf "Binary" umstellen.
    Alternativ kannst du statt der Funktion WriteAllBytes auch einfach WriteAllText benutzen. DIe Argumente bleiben die selben.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Super!
    Hab von Text auf Binary umgestellt.

    Ich nehme an, den Pfad im Browser kann ich vernachlässigen... Auch wenn an einem anderen PC die .exe meines Programms ausgeführt wird, wird die htm-datei ja mitgenommen.

    Allerdings scheint beim öffnen der htm.datei die .jar-Datei also das Javaapplet nicht mitgeöffnet zu werden.
    Diese ist ebenfalls im Resources-Ordner.

    Außerdem lädt Firefox minutenlang anscheinend etwas, was nicht geladen wird, wenn ich die lokale htm ausführe. Sucht es vielleicht nach evtl fehleneden Komponenten wie die .Jar-files?

    Muss man evtl alle benötigten Dateien in einem Schritt öffnen/ausführen, damit das Javaapplet dann im Browser mit ausgeführt wird?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Chefkoch“ ()

    Ich werde es gleich mal versuchen. Die Pfadangaben sind dann die Pfade im Resources-Ordner?
    sowas wie:
    C:/Users/Chefkoch/AppData/Roaming/WindowsApplication5/WindowsApplication5/1.0.0.0/hello.htm

    Also entsprechend die Pfade der einzelnen Daten im html-Quellcode korrigieren. Meinst du das so?
    Nein, so kann das nicht funktionieren, da der AppData Pfad ja bei jedem Benutzer anders ist. Die Pfade müssen relativ sein. Schau dir das mal an: de.selfhtml.org/html/allgemein/referenzieren.htm#relativ
    Dadurch änderst du die Pfade jetzt alle einmal und sie laufen bei jedem Benutzer, egal, wohin du die Dateien kopierst.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    so habe versucht es mit den relativen bzw absoluten Pfaden zu erledigen, aber es wollte nicht funktionieren.
    Habe den Verdacht, dass entweder ich mich blöd angestellt habe oder, dass irgendwas bei der Zerlegung des .jar-Archivs falsch läuft.

    Also habe ich probeweise mit der Ordnererzeugung mit AppData gearbeitet(probeweise, um zu sehen, ob die Datei auch aus dem Ordner heraus ausgeführt werden kann.)

    VB.NET-Quellcode

    1. IO.Directory.CreateDirectory(IO.Path.Combine(Application.UserAppDataPath, "Mein Unterordner"))
    2. System.IO.File.WriteAllBytes(IO.Path.Combine(Application.UserAppDataPath, "Mein Unterordner" & IO.Path.DirectorySeparatorChar & "Hello.htm"), My.Resources.Hello)
    3. Process.Start(IO.Path.Combine(Application.UserAppDataPath, "Mein Unterordner" & IO.Path.DirectorySeparatorChar & "Hello.htm"))



    Hat auch funktioniert... Wenn es nur die Htm-Datei war. Es war quasi die nackte Datei ohne Bilder und .jar-Applets, die mit angezeigt werden müssten.

    Also habe ich die restlichen Dateien auch in die Resourcen eingefügt und im Quellcode erstmal die Ordner erzeugt, ín die sie reinmüssen. (Habe alle Ordner wie die Originalordner benannt. Also so wie ich sie heruntergeladen hatte.)

    Leider funktioniert es nicht. einweiteres Problem ist, dass die .jar-Datei den gleichen namen hat wie die .htm-Datei. Vielleicht könnte es auch daran liegen.

    Ein Vorschlag?

    PS: Habe mal geschaut, ob ich evtl die Daten ordnerweise hinzufügen kann, wenn eine Webanwendung nehmen würde anstatt normale vbForm...
    Geht dort auch nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Chefkoch“ ()