6 Stimmen

Meine Anwendung stürzt mit einer FileNotFoundException ab, und ich verstehe nicht, warum

Ich habe einen Texteditor erstellt, der seit einem Monat ohne Probleme funktioniert. Aber heute, und alle von gestern, jedes Mal, wenn ich eine txt-Datei aus Explorer öffnen (Doppelklick), anstatt es in meinem Editor zu öffnen, erscheint eine Meldung sagen:

Text Editor ist auf ein Problem gestoßen und muss geschlossen werden. Wir bedauern für diese Unannehmlichkeiten. [Fehlerbericht senden] oder [Nicht senden].

Wenn ich auf "Was enthält dieser Fehlerbericht" klicke, wird Folgendes angezeigt:

EventType : clr20r3     P1 : texteditor.exe     P2 : 1.0.0.0     P3 : 4ad32c52     
P4 : mscorlib     P5 : 2.0.0.0     P6 : 492b834a     P7 : 343f     P8 : d8     
P9 : system.io.filenotfoundexception

Das sagt mir im Grunde, dass nach einer Datei gesucht wird, die nicht existiert. Aber hier ist mein Problem:
Die Datei, die ich zu öffnen versuche, existiert tatsächlich, denn ich habe sie gerade doppelt angeklickt

Hier ist der Code, der eine Datei öffnet, auf die im Windows-Explorer doppelt geklickt wurde:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace TextEditor
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            if (args.Length >= 1)
            {
                Form1 f = new Form1();
                f.txt.Text = System.IO.File.ReadAllText(args[0]);
                f.txt.Tag = args[0];

                Application.Run(f);
            }
            else Application.Run(new Form1());
        }
    }
}

61voto

SLaks Punkte 832502

Der Pfad, auf den Sie doppelklicken, enthält wahrscheinlich ein oder mehrere Leerzeichen, wodurch der Pfad als mehrere Befehlszeilenargumente gesendet wird.

Sie müssen die .txt Assoziation, den Pfad in Anführungszeichen zu senden und/oder Ihre Anwendung so zu ändern, dass sie alle Befehlszeilenargumente liest und mit Leerzeichen kombiniert.

Der Explorer sendet einen Befehl wie

YourApp.exe C:\Documents and Settings\YourName\My Documents\YourFile.txt

Da die Zeichenkette nicht in Anführungszeichen gesetzt ist, wird sie als 4 verschiedene, durch Leerzeichen getrennte Parameter interpretiert.

Sie können die Zuordnung ändern für .txt Dateien zu YourApp.exe "%1" (mit dem %1 in Anführungszeichen), damit die gesamte Zeichenkette als ein Argument behandelt wird.

Alternativ können Sie auch Folgendes ersetzen args[0] con String.Join(" ", args) um die Argumente wieder zusammenzufügen.

8voto

Michael Petrotta Punkte 58361

Der von Ihnen gepostete Code behandelt keine Ausnahmen (wie FileNotFoundException), die Ihr Programm erzeugt. Deshalb erhalten Sie die hässliche, nicht hilfreiche "AppCrash"-Box. Versuchen Sie als Debugging-Schritt, den problematischen Code in einen Try/Catch-Block zu verpacken, etwa so:

try 
{
  if (args.Length >= 1)
{
  // your code
}
catch (Exception e)
{
    Console.WriteLine(e);
}

So erfahren Sie zumindest, welche Methode fehlschlägt. Erstellen Sie im Debug-Modus und führen Sie es von der Kommandozeile aus, wobei sich Ihre .pdb-Datei im selben Verzeichnis befindet, und Sie erhalten die Nummer der fehlgeschlagenen Zeile.

Versuchen Sie auch, den Pfad, den Sie zu öffnen versuchen, auszudrucken (mit MessageBox oder Console.WriteLine() in der Befehlszeile). Vielleicht sehen Sie etwas Seltsames. Es hört sich so an, als ob Sie einen Dateityp mit Ihrer Anwendung verknüpft haben und Ihre Anwendung durch einen Doppelklick auf eine Datei ausführen. Die Shell könnte den Pfad zu dieser Datei auf eine Art und Weise ändern, die Sie nicht erwarten; die Ausgabe des Pfades wird Ihnen das verraten.

Wenn Sie immer noch nicht weiterkommen, posten Sie den resultierenden Stack-Trace. Es wäre auch hilfreich, vollständigen, in sich geschlossenen Anwendungscode zu posten, der das Problem demonstriert. Das Codebeispiel, das Sie gepostet haben, ist nahe dran, hat aber eine Abhängigkeit von Form1. AU$10 sagt, dass Sie dabei einen "Heureka"-Moment haben werden und das Problem erkennen.

Wenn Sie Zugang zu einem Debugger (in Visual Studio) haben, können Sie alternativ den Code schrittweise durchgehen, bis Sie die ausgelöste Ausnahme sehen.

3voto

Amirshk Punkte 7964

Offensichtlich haben Sie einen Fehler: Sie greifen auf die falsche Datei zu.

Wenn Sie den Fehler auf dem angegebenen Rechner nicht beheben können, laden Sie FileMon herunter und verwenden Sie es von sysinternals und sehen Sie, auf welche Datei Ihr Editor zugreift.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X