2009-10-13 9 views
5

Mam stworzony przeze mnie edytor tekstu, który działa bez problemu od zeszłego miesiąca. Ale dzisiaj i wszystkie wczoraj, za każdym razem, gdy otwieram plik txt z eksploratora (dwukrotne kliknięcie) zamiast otwierać go w edytorze, pojawia się komunikat:Moja aplikacja ulega awarii z wyjątkiem FileNotFoundException i nie rozumiem, dlaczego

Edytor tekstu napotkał problem i musi blisko. Przepraszamy za niedogodnoś ci . [Wyślij raport o błędzie] lub [Nie wysyłaj].

Kiedy klikam na „Co robi ten raport o błędach zawierają”, pokazuje, co następuje:

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 

Tak że w zasadzie mówi mi, że jej szukasz pliku, który nie istnieje. Ale tu jest mój problem:
Plik Próbuję otworzyć nie istnieje, bo wystarczy dwukrotnie kliknąć na nim

Oto kod, który otwiera plik, który został dwukrotnie kliknął z Eksploratora Windows:

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()); 
     } 
    } 
} 

Odpowiedz

58

Ścieżka, na którą klikasz dwukrotnie, prawdopodobnie zawiera jedną lub więcej spacji, powodując wysłanie ścieżki w postaci wielu argumentów wiersza poleceń.

Należy zmienić skojarzenie .txt, aby wysłać ścieżkę w cudzysłowie i/lub zmienić aplikację, aby odczytać wszystkie argumenty wiersza polecenia i połączyć je ze spacjami.

Explorer wysyła polecenia takiego jak

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

Ponieważ nie ma żadnych cytatów wokół napisu, to interpretowane jako 4 różnych parametrów oddzielonych spacjami.

Możesz zmienić powiązanie dla plików .txt na YourApp.exe "%1" (z cytatem %1), aby wymusić, aby cały ciąg traktować jako jeden argument.

Alternatywnie można zastąpić args[0] przez String.Join(" ", args), aby ponownie połączyć argumenty.

+1

Ostatnia sugestia dotyczy między innymi nazw plików zawierających więcej niż jedno miejsce z rzędu. Wystarczy podać nazwę ścieżki. –

3

Oczywiście masz błąd: dostęp do niewłaściwego pliku.

Jeśli nie możesz debugować błędu na danym komputerze, pobierz i użyj FileMon z sysinernals i zobacz, do jakiego pliku ma dostęp edytor.

8

Kod, który wysłałeś, nie obsługuje żadnych wyjątków (takich jak FileNotFoundException) generowanych przez Twój program. Dlatego otrzymujesz brzydkie, niepomocne pudełko "AppCrash". Jako krok debugowania, spróbuj zawijania kod problematyczny w bloku try/catch, tak:

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

to powie, co najmniej, metoda, która jest wadliwa. Zbuduj w trybie debugowania i uruchom z wiersza poleceń z plikiem .pdb w tym samym katalogu, a otrzymasz numer linii z błędem.

Spróbuj również wydrukować ścieżkę, którą próbujesz otworzyć (przy użyciu MessageBox lub Console.WriteLine() z wiersza poleceń). Możesz zobaczyć coś dziwnego. Wygląda na to, że z aplikacją skojarzyłeś typ pliku i uruchamiasz aplikację, klikając dwukrotnie plik. Powłoka może zmieniać ścieżkę do tego pliku w sposób, jakiego się nie spodziewasz; wydrukowanie ścieżki powie Ci o tym.

Jeśli nadal utkniesz, opublikuj wynikowy ślad stosu. Pomocne byłoby również opublikowanie kompletnego, samodzielnego kodu aplikacji, który demonstruje problem. Wysłany przykład kodu jest blisko, ale ma zależność od Form1. 10 USD mówi, że w trakcie tego procesu będziesz mieć moment "Eureka" i zobaczysz problem.

Ewentualnie, jeśli masz dostęp do debuggera (w Visual Studio), możesz przejść przez ten kod, aż zobaczysz wyjątek zgłoszony.

+1

Uzgodnione. Ponadto, jeśli tworzysz blok catch-everything i po prostu logujesz się do dziennika zdarzeń, możesz zostawić go w kodzie produkcyjnym, a dostarczy on przydatne informacje zwrotne na wypadek innych awarii w terenie. –

+0

dziękuję Micahel, próbowałem twojej drogi, i kiedy próbuję otworzyć plik z eksploratora, wyjątek jest wyświetlany w skrzynce z wiadomościami mówiąc "Nie można znaleźć pliku" C: \ Dokumenty. "Nawet jeśli plik jest rzeczywiście w środku:" C: \ Documents and Settings \ User \ My Documents \ file.txt ".. tak, myślę, że ma to coś wspólnego z ścieżką do pliku zawierającą więcej niż jedno miejsce, jak Slaks wymieniony poniżej. –

+0

Tak, dźwięki Najłatwiejszym rozwiązaniem jest naprawienie powiązania plików. Zakładając <= WindowsXP, przejdź do Opcje folderów, Typy plików, znajdź powiązanie plików i kliknij "Zaawansowane", edytuj powiązanie i w polu tekstowym pod "Aplikacja użyte do wykonania akcji ", upewnij się, że% 1 ma cytaty dookoła niej, a skończysz z czymś takim jak:" "c: \ program files \ myapp.exe" "% 1" ' –

Powiązane problemy