relativen Programmpfad - wie?

  • C#

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Mia.

    relativen Programmpfad - wie?

    Neu

    hey, wenn ich einen absoluten Pfad haben möchte, geht das so:

    C#-Quellcode

    1. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    2. "ORDNERNAME");


    Wie aber mache ich daraus einen relativen Pfad zur exe des Programms?

    Also PROGRAMM.exe befindet sich z.B.(soll variabel sein können) hier: D:\Tools\PROGRAMM.exe

    Dann soll der Pfad hier sein: D:\Tools\PROGRAMM.exe\UNTERORDNERNAME

    danjke!

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

    Neu

    VB.NET-Quellcode

    1. Dim DeinZielpfad = IO.Path.Combine(IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME")
    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.

    Neu

    hast du wirklich einen Ordner namens
    \PROGRAMM.exe\
    ?
    Da sind Fehler eigentlich programmiert.

    Wie dem auch sei. "relativer Pfad" beinhaltet das Wort "relativ". Und "relativ" ist immer relativ zu etwas anderem.
    Wenn du also von einem absoluten Pfad einen Relativen Pfad ableiten willst, brauchst du einen zweiten Pfad, zu dem der relative Pfad dann relativ sein kann.
    Oder auf irgendeine andere Weise musst du das definieren, zu dem der Pfad relativ sein kann.

    Neu

    Nein, habe ich nicht. Es war so gemeint, dass der Pfad, wo die Exe ist folgender ist:
    D:\Tools\

    Die exe selbst heisst:
    PROGRAMM.exe
    (daher habe ich sie groß geschrieben)

    Und darunter soll dann ein Unterordner erstellt werden namens: UNTERORDNERNAME
    (auch wieder groß geschrieben, weil es ein Beispiel ist)


    Den Code von VaporiZed verstehe ich nicht. (ich hatte da schlechterweise etwas vom Code weggelassen) Was müsste ich 1:1 austauschen für:

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ??
    2. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    3. "ORDNERNAME");


    Hier nochmal als Bild aus Visual Studio:
    [attach=48898][/attach]
    (siehe Bild ganz unten im Beitrag)



    Wenn ich es so mache:

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ??
    2. IO.Path.Combine(IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME");

    Dann erhalte ich folgende Fehlermeldung:
    "Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler CS0103 Der Name "IO" ist im aktuellen Kontext nicht vorhande C D:\Temp\C\src\C\Configuration.cs 37 Aktiv"
    Bilder
    • relativ.jpg

      5,22 kB, 801×50, 12 mal angesehen
    • relativ.jpg

      5,22 kB, 801×50, 18 mal angesehen

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Mia“ ()

    Neu

    Bilder solltest Du forenintern über [+ Erweiterte Antwort] -> _|Dateianhänge|_ -> [Hochladen] posten. Nicht wenige (Power)User hier klicken ungern auf ImageHosterLinks und stellen stattdessen die Hilfe hier im Thread ein bzw. fangen gar nicht erst mit Hilfe an. Deine Entscheidung.

    jagutähh, C# eben …

    C#-Quellcode

    1. string DeinUnterordnerpfad = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME");

    Und was genau verstehst Du an meinem Code nicht? Das Teil schaut, in welchem Ordner die Exe ist, nimmt eben jenes Verzeichnis und fügt noch den Namen Deines Unterordners dran. Fertig ist der Lack.
    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.

    Neu

    @Bild. So etwas hatte ich gesucht. Nur leider kann ich so das Bild nicht an die Textstelle einfügen, wo ich es möchte. Sondern nur ganz unten anhängen im Post.

    Dankje. Also ich bin einfach mit deinem Code überfordert. Ich hatte gehofft, dass ich meinen Code 1:1 austauschen kann. Das ergibt jedoch den oben genannten Fehler. Wenn ich nun also:

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ??
    2. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    3. "ORDNERNAME");


    mit:

    C#-Quellcode

    1. string DeinUnterordnerpfad = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME");

    ersetze, dann klappt das (natürlich) auch nicht.

    Denn im Programm wird ja "CDirectory" gesucht dann. Es wird darauf verwiesen und nicht mehr gefunden. Weil es nirgends mehr definiert wird.

    Und dieses ebenfalls nicht:

    C#-Quellcode

    1. CDirectory = string DeinUnterordnerpfad = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME");


    Was ich suche ist eine 1:1 Ersetzung meines Code-Abschnitts hier oben im Post. Wo anstelle des AplicationData-Ordner von Windows dann ein relativer Pfad zur PROGRAMM.exe genutzt wird.

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

    Neu

    Wie man ein Bild in den Text einfügt:


    Und zum Code:

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ??
    2. Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
    3. "ORDNERNAME");

    ersetze Zeile#2 sinnvoll durch den Teil meines Codes nach dem =
    Also

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ??
    2. System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME"),
    3. "ORDNERNAME");


    Das Verstehen und Verwenden fremden Codes und der Einbau in den eigenen ist hier im Forum überlebenswichtig. Sonst gilt man schnell als Codeschnorrer oder Grundsatznichtversteher. Und man steht schnell auf verlorenem Posten.

    ##########

    Eh, Moment mal. Was ist denn das eigentlich für ne komische Syntax? Das ist doch kein gesundes C#. Ich kenne sowas hier:

    C#-Quellcode

    1. bool Foo = true;
    2. string CDirectory = Foo ? System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME") : "ORDNERNAME";

    Aber string plus ?? kommt mir komisch vor. Wurde da was neues in C# eingebaut?

    ##########

    Ah, das ist dieser Nullkoala. Dann:

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ?? System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME");

    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.

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

    Neu

    Danke! Ja, ich muss das aber auch nachvollziehen können erst einmal.

    Das mit dem Bild an Textstelle einfügen klappt nicht so richtig. Der verwendet den alten Link von dem Bild nun, obwohl ich den gelöscht habe. Naja, beim nächsten Mal sollte es dann klappen. Dann mache ich das direkt richtig.

    Jedenfalls war ja dein Code somit auch noch nicht funktionstüchtig. Es muss ja so lauten:

    C#-Quellcode

    1. CDirectory = Arguments.WorkingDirectory ??
    2. System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "UNTERORDNERNAME");


    System.IO.Path.Combine erwartet ja ein Ende, nachdem der Ordnername definiert wurde. Und keine 2. Option namnes "ORDNERNAME".

    Also zumindest halbwegs verstanden nun von mir :)

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

    Neu

    Nur ich habe nachwievor nicht verstanden, was du nun unter einem "relativen Pfad" verstehst.
    Bist du der Ansicht, dass Vaporized das verstanden hat?
    Oder gehts inzwischen garnet mehr um einen relativen Pfad?
    Von den Codeschnipseln her, die ich gesehen habe könnte es um den AnwendungsPfad gehen, also um den Ordner, in dem eine PROGRAMM.exe liegt.
    Das müsstest du aber sagen, wenn es darum geht - ein AnwendungsPfad ist nicht ein relativer Pfad.
    Allerdings kann man relative Pfad-Angaben machen, nämlich relativ zum AnwendungsPfad, und die kann man auch in absolute Pfade umwandeln und vice versa.
    Dassis ein Kinderspiel (wenn man weiss, dass es gespielt werden soll).

    Also man kann als relativen Pfad angeben: \Settings\UserSettings\.
    Wenn nun der AnwendungsPfad der PROGRAMM.exe bekannt ist, ist \Settings\UserSettings\ eine eindeutige Pfad-Angabe, mittels Path.Combine() auflösbar.
    Es sind auch solche Pfade denkbar, relativ zum AnwendungsPfad: ..\..\UserSettings\. Dieser Pfad verwiese dann auf einen anderen Zweig, und wäre nicht ein UnterOrdner des AnwendungsPfades.
    Usw. Viel ist möglich, wenn klar gesagt wird, was gewünscht.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Neu

    @Mia: Da haben sich wohl mein Edit von 00:08 (Stichwort "Nullkoala") und Dein um 00:21 abgeschickter Post überschnitten. Wir kommen zum gleichen Ergebnis.
    @ErfinderDesRades: Nette Umschreibung. Bei mir kommt an: »VaporiZed, Du hast keine Ahnung, was relative Pfadangaben sind.« ;) TE und ich verstehen wohl unter relativem Pfad das hier: Das Ziel ist abhängig dort zu finden, (egal) wo die Exe ist. Wenn die Exe in D:\Test ist, ist das Ziel D:\Test\Unterprogrammordner. Ist die Exe in F:\Foo\Test, ist das Ziel F:\Foo\Test\Unterprogrammordner. Das ist uns relativ zur Exe genug.
    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.

    Neu

    Ohjo, hat sich am Ende überschnitten - hatte ich schon gesehen. Der Edit von mir kam Stunden später, aber hatte die Lösung bereits vor Dir. Hab´ ich wenigstens mal korrekt mitgedacht :) Also ich vestehe das so wie Vaporized. Relativ von der Exe des Programms ausgesehen. Aber ein "Du hast keine Ahnung" kann ich da auch nicht herauslesen.

    Einen schönen Start in die Woche!