Dynamischen Dateipfad ermitteln

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Dynamischen Dateipfad ermitteln

    Hallo,Ich habe ein großes Problem in VB.NET! Ich bin gerade dabei in Visual Basic.net ein Spiel zu programmieren. Um daten abzuspeichern erstelle ich per Befehl Dateien in einem Ordner. Dies mache ich mit dem Pfad: ".\data\" ("data" ist der Ordner, in dem die Dateien erstellt werden sollen.)
    Nun mein Problem: Wenn ich das Programm nun auf einem anderen PC laufen lasse, kommt dort eine Fehlermeldung, die besagt, dass der Pfad nicht gefunden wurde. Anscheinend sucht das Programm nicht wirklich nach ".\data", sondern sucht nach
    "C:\Users\MeinNutzername\" (also nach meinem User)
    Wie bekomme ich es hin, dass Dateien immer in ".\data", auf anderen PCs gespeichert werden?

    Ich hoffe ihr versteht mein Problem. Es ist für mich ziemlich schwer es zu schildern.


    Vielen dank für Antworten!
    LG, ProgrammiererHans

    *Thema verschoben und vernünftigen Titel angegeben* ~NoFear23m
    @ProgrammiererHans bitte schau dir folgenden Thread mal an: [Allgemein] VB.NET, VB6, VBA, VBS — Mit welcher Sprache programmiere ich eigentlich?

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

    Wo soll Der Ordner data denn ganau liegen, im Benutzerverzeichnis, im Anwendungsverzeichnis, oder wo ?

    Guck dir mal volgendes an:
    Environment.SpecialFolder

    Environment.GetFolderPath
    Application.StartupPath
    Path.Combine

    VB.NET-Quellcode

    1. Dim MyPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "data")
    Der Pfad: ".\data\" bedeutet, dass der Ordner data gleich bei deiner EXE-Datei liegt.
    Wenn du dein Program an einem anderen Computer laufen lässt, musst der Order "date"
    natürlich mit, sonst findet das Programm den Ordner nicht.

    Man könnte auch Programmiertechnisch sofern der Ordner keinen bestimmten Inhalt hat
    erstellen lassen. Dein Programm findet dan den Ordner wieder.

    Freundliche Grüsse

    exc-jdbi
    Das kommt m.E. auch darauf an, wie Du diesen Pfad nutzt. Wenn ich schreibe:

    VB.NET-Quellcode

    1. Dim FilePath = ".\data\1.txt"
    2. Label1.Text = IO.File.ReadAllText(FilePath)
    erhalte ich abhängig davon, wo ich die fertige EXE habe, eine andere Pfadangabe. Passt also grundsätzlich vom Verhalten. Wie sieht Dein Pfadzugriffscode denn konkret aus?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo, Ja natürlich ist mir bewusst, dass der Ordner "Data" bei meiner .exe Datei liegt (Das soll ja eben ".\" bewirken).
    Und wenn ich die .exe Datei nun z.B. mit einem Stick auf einen anderen PC verschiebe, nehme ich den Ordner natürlich mit.
    Allerdings scheint das Programm nicht "Data" in ".\" zu suchen, sondern im User von meinem PC (Und der ist ja auf allen PCs unterschiedlich benannt, wodurch die Fehlermeldung erscheint.)
    Und das ist mein Problem. Hoffe, ihr versteht das irgendwie :D
    Trotzdem danke für jegliche Hilfe!

    Der Befehl, den ich nutze:
    If not System.IO.file.exists(".\data\Anmeldung.dll") then
    System.IO.file.create(".\data\Anmeldung.dll")
    end if

    Sorry, aber ich weiß nicht, wie man das hier im Forum mit dem "VB.NET-Quellcode" macht :D
    MfG, ProgrammiererHans

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ProgrammiererHans“ ()

    Die Punktadressierung adressiert relativ zum Workdirectory.
    Das muss nicht gleich sein wie das Verzeichnis der EXE.
    Den vollen Pfad der EXE kriegst du mittels System.Reflection.Assembly.GetExecutingAssembly().CodeBase
    Daraus das Verzeichnis extrahieren: System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    Und wenn du noch das Data-Unterverzeichnis benötigst:

    VB.NET-Quellcode

    1. Dim Datapath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase),"data")

    Das funktioniert im Gegensatz zu Application.StartupPath auch bei Nicht-Forms-Anwendungen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Eierlein schrieb:

    Dein Programm muss erst in das Verzeichnis der Exe wechseln, dann sollte es mit '.\data' funktionieren.


    Ist es doch schon nur, wenn ich dieses Programm und den Ordner auf einen anderen PC verschiebe, dann wird "Data" nicht in ".\" (Also in dem Order, in dem sich die EXE befindet), gesucht, sondern in "C:\Users\MeinUser\Desktop\Data" und der User
    ist ja auf jedem PC anders benannt. Also was muss ich nun eingeben, damit Data auch wirklich in ".\" gesucht wird?

    ProgrammiererHans schrieb:

    Also was muss ich nun eingeben, damit Data auch wirklich in ".\" gesucht wird?
    Du scheinst etwas ignorant zu sein.

    petaod schrieb:

    Die Punktadressierung adressiert relativ zum Workdirectory.
    Deshalb:

    Eierlein schrieb:

    Dein Programm muss erst in das Verzeichnis der Exe wechseln
    Damit ist das Workdirectory gemeint.

    Und wenn du das nicht willst, dann halte dich an Post #7.
    Wo ist jetzt noch ein Problem?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @ProgrammiererHans das hat dir doch @petaod schon geschrieben!?!?

    VB.NET-Quellcode

    1. Dim Datapath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase),"data")


    Oder funzt das etwa nicht? Wenn du eine antwort schreibst sei doch bitte so gut und gehe auf die Dinge ein die dir angeraten werden und sag und ob es funzt. Und wenn nicht welche Fehlermeldung kommt oder wie sich das "nicht funktionieren" äußert.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##