Der verflixte relative Pfad

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Trebron.

    Der verflixte relative Pfad

    Hallo zusammen,

    ich möchte Audiosequenze auf einer Form abspielen.
    Dazu habe ich den WindowsMediaPlaer eingebunden.
    Die mp3-Files liegen in Verzeichnissen, nicht in den Ressourcen!

    Mein Code sieht so aus:

    VB.NET-Quellcode

    1. Dim myAudio As String = "C:\Users\Mein Name\source\repos\xyz1\xyz2\Audio\K1\ABC_Texte\Druck_klein.mp3"
    2. AxWindowsMediaPlayer1.URL = myAudio
    3. AxWindowsMediaPlayer1.Ctlcontrols.play()


    Das funktioniert ja auch.
    Aber wie sieht die Verzeichnis-Struktur beim User aus? Ich müsste doch die Variable mit einer relativen Pfadangabe beschreiben.
    Gibt es da eine universelle Möglichkeit, das z. B. die Datei "Druck_klein.mp3" immer gefunden wird?

    Vielen Dank für eure Hilfe!
    Schönen Gruß
    Trebron

    - Visual Studio Community 2017 -
    Es gibt verschiedene Lösungswege, hängt davon ab was du am Ende willst.
    1. Der User könnte den Pfad zur Datei auswählen.
    2. Die Datei liegt neben deiner Anwendung oder in einem Unterordner, dann könntest du dir den Pfad mit Assembly.GetExecutingAssembly().Location zusammenrechnen.
    3. Du suchst die ganze Festplatte nach der Datei ab (just kidding, das wäre die schlechteste Methode überhaupt)
    1. Möglichkeit: Der User soll die Datei per FilePicker selber raussuchen.
    2. Wenn sich jetzt nur der Benutzername unterscheidet, dann ist das ja relativ simpel mit Stringmanipulation
    3. Wenn die Zieldatei allerdings irgendwo ist, aber eben relativ zur EXE: Du bastelst Du eine passende Funktion, die dann aus Deiner Angabe (\..\..\Musik\Druck_klein.mp3) nen absoluten Pfad macht. Aber irgendwie hab ich das Gefühl, dass es da schon was im Framework gibt.

    ##########

    meh, ich war zu langsam ||

    ##########

    Jou: IO.Path.GetFullPath(DeinAbsoluterPfadDerExe & "\..\..\Musik\DeineDatei.mp3") -> von Deiner Exe geht es ein Verzeichnis aufwärts, dann in den Unterordner Musik. Als Beispiel.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    @Trebron Implementiere D&D, dass der User seine Dateien einfach auf Deine Form ziehen kann.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Trebron schrieb:

    C:\Users\Mein Name\
    Sieht für mich aus wie ein SpecialFolder.
    Wenn das durchgängig für alle User ist, kann man das über Environment adressieren.
    Siehe auch hier.
    Aber wenn das so ist, sollte man eigentlich AppData verwenden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bitte, bitte, bitte NIE davon ausgehen, dass die Benutzerverzeichnisse bei jedem User nach demselben Schema aufgebaut sind. Und nicht versuchen, irgendwelche Pfade aufgrund irriger Annahmen selbst "zusammenzuschustern". Ich hab vor 20 Jahren schon Software verflucht, die irgendwelche DLLs in C:\Windows gesucht hat oder davon ausging, dass der Programme-Ordner "C:\Program Files\" heißt (was beim deutschen Windows nicht immer Standard war).
    Meine Benutzerdaten liegen z.B. in einem Pfad auf Laufwerk E.
    Und jedes intelligente (!) Programm weiß das auch, dafür gibt es in .NET die Klasse Environment.

    Wenn du mit dem Programm (statische) Mediendateien auslieferst, die von Programm benötigt werden, gehören diese in den Installationsordner des Programms. Veränderbare Daten gehören nach AppData. Wenn der Benutzer andere Mediendateien auswählen können soll, lass ihn den Pfad selbst aussuchen und unterstütze ihn zumindest soweit, dass du seinen Pfad für die entsprechenden Dateitypen ermittelst und diesen bei der ersten Auswahl vorschlägst (z.B. Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)).

    Da braucht's nichtmal relative Pfadangaben. Und wenn du doch mal relative Pfade brauchst, ist die statische Path-Klasse unabdingbar.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    @VaporiZed "IO.Path.GetFullPath(DeinAbsoluterPfadDerExe & "\..\..\Musik\DeineDatei.mp3")"
    "DeinAbsoluterPfadDerExe" kenne ich ja nur auf meinem System, nicht aber auf Usersystemen.


    @Arby "Wenn du mit dem Programm (statische) Mediendateien auslieferst, die von Programm benötigt werden, gehören diese in den Installationsordner des Programms."
    Im Installationsordner liegen die Verzeichnisse: "\Audio\K1\ABC_Texte\Druck_klein.mp3"

    Ich benötige also "nur" den Speicherort des Installationsordners.

    Ich habe bis jetzt alle Empfehlungen "getestet", finde aber keine brauchbare Lösung, die unter VS 2018 und auf Fremd-PCs funktioniert.

    Mein aktueller Stand der nicht funktioniert ist:

    VB.NET-Quellcode

    1. Dim path1 As String = Assembly.GetExecutingAssembly().Location
    2. Dim path2 As String = "\Audio\K1\ABC_Texte\Druck_klein.mp3"
    3. Dim myAudio As String = Path.Combine(path1, path2)

    Hier findet aber keine Verknüpfung von path1 und path2 statt, sondern es wird nur path2 ausgegeben.

    Was mache ich falsch?
    Schönen Gruß
    Trebron

    - Visual Studio Community 2017 -
    Dass Du den Pfad Deiner Exe im Wortlaut selber nicht, kennst ist eine Sache. Aber das Programm, also die EXE selbst kennt sie: Application.ExecutablePath
    Und damit kannst Du Dir dann den Pfad basteln. Es setzt allerdings voraus, dass die Audio-Dateien in fester, relativer Beziehung pfadtechnisch zur EXE stehen, also z.B.
    ........Schülerhilfe\DeineDatei.exe -> Datei ist im Schülerhilfe-Ordner
    ........Schülerhilfe\Audio\DeineAudiodatei.mp3 -> Datei ist im Schülerhilfe\Audio-Ordner
    Dann eben: Dim PfadZurAudiodatei = IO.Path.GetFullPath(Application.ExecutablePath, "\..\Audio\DeineAudioDatei.mp3")
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dementsprechend kann auch bei Path.Combine nichts Sinnvolles heraus kommen. Du kannst zu *.exe nichts kombinieren.

    VB.NET-Quellcode

    1. Dim path1 As String = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ' Nur den Pfad Anteil
    2. Dim path2 As String = "Audio\K1\ABC_Texte\Druck_klein.mp3" ' Kein Backslash am Anfang
    3. Dim myAudio As String = Path.Combine(path1, path2)
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @MrTrebron
    path1 liefert mir jetzt richtigerweise nur den Pfadanteil:
    "C:\Users\Mein Name\source\repos\xyz1\xyz2\bin\Debug\"
    aber, der korrekte Pfad darf nicht bin\Debug\ beinhalten. Laut Explorer macht er das auch nicht.
    Muss ich an den Projekteinstellungen etwas ändern?
    Schönen Gruß
    Trebron

    - Visual Studio Community 2017 -
    Deine Dateien müssten schon in den Zielpfad kopiert werden. Wenn der Ordner Audio auch im VS vorhanden ist kann man bei den Properties für jede Datei einstellen dass diese auch kopiert werden (Geht auch wen man mehrere Markiert) .
    Beim Build sollen die Dateien ja auch mitgeliefert werden
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.