none
Automatisches Einlesen eines Dateipfades RRS feed

  • Frage

  • Guten Morgen,
    ich bin noch unerfahren bei der Anwendung von C# und brauche daher eure Hilfe :)
    Folgendes: Ich habe einen Ordner, der z.B ".txt" und ".docx" Dokumente enthält. Der Anwender kann beispielsweise ein .txt-Dokument mit meinem erstellen Programm (also der EXE) öffnen. Anschließend werden dann bestimmte Dinge erfolgen, die hier nicht von Relevanz sind.
    Das Problem ist, dass in meinem aktuellen Code der Pfad statisch ist. Ich möchte aber je nach angeklicktem Dokument (bzw. auf welche die EXE angewendet wurde) dessen Pfad einlesen, also eher in Richtung dynamisch.
    Ist es überhaupt der richtige Weg, das Dokument mit der EXE auszuführen oder gibt es eine bessere Lösung?
    Habe schon verschiedene Klassen angeschaut, ohne Erfolg. Immer musste man den Pfad angeben, allerdings kommt das ja auf den Verwender an, welche .txt-Datei er ausgewählt hat, also ob die im z.b. im C- o. D-Laufwerk liegt.
    Danke.
    static void Main(string[] args)
            {
                string sourceFile = @"C:\Users\Documents\test1.txt";
                string sourcePath = Path.GetDirectoryName(sourceFile);
    
                //Determine if file is of type ".txt"
                if (".txt" != Path.GetExtension(sourceFile))
                {
                    Console.WriteLine("This EXE does not work with the choosen file");
                    Console.WriteLine("Programm will terminate in the next step");
                    Console.ReadLine();
                    return;
                }
                //Create a folder in the current path get the name of the choosen file
                string targetFolder = Path.Combine(sourcePath, Path.GetFileNameWithoutExtension(sourceFile));
                if(!Directory.Exists(targetFolder))
                {
                    Directory.CreateDirectory(targetFolder);
                }
    }

    Sonntag, 22. Mai 2016 08:16

Antworten

Alle Antworten

  • Hallo Roger,

    in einem Konsolen-Programm müsstest Du den Pfad über Console.ReadLine einlesen sowie über Directory.Exists testen, ob es ein gültiges Verzeichnis ist.

    Komfortabler mit Benutzerführung ginge es erst mit Windows Forms oder WPF, in dem Du den Datei-Öffnen-Dialog (WPF / Windows Forms) oder den Verzeichnis-Auswahl-Dialog (WPF + Windows Forms) verwendest.

    Was die Ausführung angeht:

    Du kannst sowohl eine Datei über ihre Erweiterung ausführen lassen, in dem Du die UseShellExecute-Eigenschaft auf wahr setzt. Dabei kommt das gleiche Prinzip wie im Windows Explorer zum Tragen. Windows schaut nach, ob ein ausführbares Programm für die Erweiterung registriert ist und verwendet diese.

    Alternativ geht ebenso ein festes Programm zu verwenden und ihm den Dateinamen als Arguments zu übergeben. Was man im allgemeinen tut, wenn man nicht die Standard-Anwendung verwenden will. Dabei sollte der Dateiname in Anführungszeichen gesetzt werden, für den Fall das Leer- oder Sonderzeichen darin vorkommen - das gilt auch für den Programmnamen.

    Um sicher zu gehen, dass auch bei relativen Dateinamen die richtige Datei verwendet wird, sollte man immer das WorkingDirectory setzen.

    Gruß Elmar

    Sonntag, 22. Mai 2016 09:04
    Beantworter
  • Hallo Elmar,
    danke für deine schnelle Antwort.
    Wenn ich das richtig verstanden habe und davon ausgehe, dass in einer Konsolenanwendung zu realisieren, bleibt mir nur folgende Möglichkeit: Den Pfad per "Hand" in die Konsole über Console.ReadLine einlesen? Oder was meinst du mit Argumente übergeben (das muss ich ja dann auch händisch machen, oder übernimmt er irgendwie automatisch den Pfad der .txt-Datei, auf die gerade die EXE angewendet wurde als Argument)? Wenn das so ist, wäre das natürlich nicht so benutzerfreundlich...:(
    Danke.
    Gruß Roger
    Sonntag, 22. Mai 2016 11:05
  • Hallo Roger,

    was die Eingabe eingeht ist eine Konsole sehr eingeschränkt - vergleichbar der Windows Eingabe-Aufforderung ohne Extras. ReadLine liest zuerst mal alles ein - ob es das  Richtige ist, musst Du selbst prüfen.

    Die Geschichte mit dem Argument bezieht sich auf den zweiten Teil Deiner Frage, also dem Ausführen dessen was Du durch Konstante bzw. Eingabe übergibst.

    Man kann entweder "C:\Pfad\ProgrammName.EXE" "C:\Users\Public\Documents\Datei.txt" übergeben, wodurch die Datei durch ProgrammName geöffnet wird.

    Oder aber "C:\Users\Public\Documents\Datei.txt", womit man Windows entscheiden lässt, welches Programm die Datei Endung ".txt" öffnet - im Standard wäre es notepad.exe.

    Das kann man über den Explorer oder auch die Eingabeaufforderung testen.

    Gruß Elmar

    Sonntag, 22. Mai 2016 11:50
    Beantworter
  • Hallo Elmar,
    dann habe ich mich falsch ausgedrückt, sorry.
    Also der Anwender soll letztendlich nichts anderes machen, also "Rechtsklick" auf die Datei (z.B. .txt-Datei) und statt mit dem Editor eben mit der EXE öffnen.
    Ich möchte nicht, dass die Anwender (diese sind noch mehr Laie als ich) irgendwas in die Konsole eingeben muss. Ist es trotzdem möglich, an den Pfad zu kommen, auf die die EXE in diesem Moment angewendet wird?
    Fragen über Fragen, aber leider finde ich dazu bisher nichts in diversen Foren....vielleicht suche ich auch nach den falschen Stichwörtern. Danke nochmals.
    Gruß
    Sonntag, 22. Mai 2016 13:22
  • Hallo Roger,

    das funktioniert mit einer Konsolen-Anwendung nicht (so ohne weiteres).

    Klicken ist in der Kommandozeile nicht vorgesehen. Erweiterungen, die z. B. die Dateien aus dem aktuellen Verzeichnis vorschlagen - wie die TAB-Taste in der Eingabeaufforderung -, dürften Deine derzeitigen Programmierkünste übersteigen.

    Wenn Du nicht zwangsweise (Schule etc.) auf eine Konsolen-Anwendung festgenagelt bist, probiere mal den Weg über eine WPF Anwendung - den Code aus dem oben genannten Link kannst Du zu Anfang übernehmen. Damit kannst Du weitere Dinge ausprobieren, die mit Dateien zusammenhängen.

    Eine Rückbau auf eine Konsolen-Anwendung ist mit dem so gewonnen Wissen leichter möglich - nur eine Auswahl ist dort komplex.

    Gruß Elmar

    Sonntag, 22. Mai 2016 13:38
    Beantworter
  • Hi,

    falls Du meinst, dass man bspw. im Windows Explorer über "Öffnen mit..." eine Datei mit deiner Anwendung öffnen soll, lies mal in deiner Main Methode die übergebenen Argumente (stehen bei dir in der args Variable) aus. Dort steht, wenn nichts weiter gemacht wurde, der vollständige Pfad der Datei drin, für die "Öffnen mit ..." ausgewählt wurde.

    Falls Du einen für einen Dateityp generell deine Anwendung als Standardanwendung registrieren willst, schau mal hier:

      https://sarveshknet.wordpress.com/2012/07/24/associate-file-extension-with-application/


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Sonntag, 22. Mai 2016 15:08
    Moderator
  • Hallo zusammen,
    genau, das ist das, was ich suchte. Danke Stefan.
    Ich werde aber auch mal den Lösungsvorschlag von Elmar umsetzen.
    Gruß
    Sonntag, 22. Mai 2016 17:26