2009-10-13 6 views
5

J'ai un éditeur de texte que j'ai fait, qui fonctionne parfaitement depuis un mois sans aucun problème. Mais aujourd'hui, et tous hier, chaque fois que j'ouvre un fichier txt de l'explorateur (double-cliquant dessus) au lieu de l'ouvrir dans mon éditeur, un message apparaît disant:Mon application se bloque avec une exception FileNotFoundException, et je ne comprends pas pourquoi

Text Editor a rencontré un problème et doit Fermer. Nous sommes désolés pour ce désagrément. [Envoyer un rapport d'erreur] ou [Ne pas envoyer].

Lorsque je clique sur « Qu'est-ce que ce rapport d'erreurs », il montre les éléments suivants:

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 

Alors que me dit essentiellement que sa recherche d'un fichier qui n'existe pas. Mais voici mon problème:
Le fichier que je suis en train d'ouvrir DOES exist parce que je double clic sur ce

Voici le code qui ouvre un fichier qui a été un double clic sur l'explorateur de 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()); 
     } 
    } 
} 

Répondre

58

Le chemin sur lequel vous double-cliquez contient probablement un ou plusieurs espaces, ce qui entraîne l'envoi du chemin en tant qu'arguments de ligne de commande.

Vous devez modifier l'association .txt pour envoyer le chemin entre guillemets et/ou modifier votre application pour lire tous les arguments de ligne de commande et les combiner avec des espaces.

Explorer envoie une commande telle que

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

Comme il n'y a pas de guillemets autour de la chaîne, il est interprété comme 4 différents paramètres séparés par des espaces.

Vous pouvez modifier l'association des fichiers .txt en YourApp.exe "%1" (avec les guillemets %1) pour forcer l'ensemble de la chaîne à être traitée comme un argument. Vous pouvez également remplacer args[0] par String.Join(" ", args) pour remettre les arguments en place.

+1

La dernière suggestion se décompose pour les noms de fichiers avec plus d'un espace dans une rangée, entre autres. Le simple fait de citer le nom du chemin est la voie à suivre. –

3

Évidemment, vous avez un bug: accéder au mauvais fichier.

Si vous ne pouvez pas déboguer l'erreur sur l'ordinateur donné, téléchargez et utilisez FileMon de sysinernals et de voir quel fichier est accédé par votre éditeur.

8

Le code que vous avez publié ne gère aucune exception (comme FileNotFoundException) que votre programme génère. C'est pourquoi vous obtenez la boîte "AppCrash" laide et inutile. Comme une étape de débogage, essayez d'emballage le code problématique dans un bloc try/catch, comme ceci:

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

Cela vous dira, au moins, la méthode qui est défaillante. Construire en mode débogage, et exécutez à partir de la ligne de commande avec votre fichier .pdb dans le même répertoire, et vous obtiendrez le numéro de ligne défaillant.

Également, essayez d'imprimer le chemin que vous essayez d'ouvrir (à l'aide de MessageBox ou de Console.WriteLine() à partir de la ligne de commande). Vous pourriez voir quelque chose d'étrange. Il semble que vous ayez associé un type de fichier à votre application et exécutez votre application en double-cliquant sur un fichier. Le shell peut changer le chemin d'accès à ce fichier d'une manière inattendue. l'impression du chemin vous le dira.

Si vous êtes toujours bloqué, publiez la trace de la pile résultante. Il serait également utile d'afficher un code d'application complet et autonome qui illustre le problème. L'exemple de code que vous avez publié est proche, mais dépend de Form1. AU $ 10 dit que dans le processus de faire cela, vous aurez un moment "Eureka" et voir le problème. Sinon, si vous avez accès à un débogueur (dans Visual Studio), vous pouvez parcourir le code jusqu'à ce que l'exception soit levée.

+1

D'accord. En outre, si vous construisez un bloc catch-everything et que vous le connectez simplement au journal des événements, vous pouvez le laisser dans le code de production, et il fournira des informations utiles en cas d'autres pannes sur le terrain. –

+0

merci Micahel, j'ai essayé votre chemin, et quand j'essaie d'ouvrir le fichier à partir de l'explorateur, l'exception est affichée dans une boîte de message disant "Impossible de trouver le fichier 'C: \ Documents'. C: \ Documents and Settings \ Utilisateur \ Mes Documents \ fichier.txt "... donc, je pense qu'il a quelque chose à voir avec le chemin de fichier ayant plus d'un espace dedans, comme Slaks mentionné ci-dessous? –

+0

Yep, sons La manière la plus simple de résoudre ce problème est de réparer l'association de fichiers En supposant <= WindowsXP, allez dans Options des dossiers, Types de fichiers, trouvez votre association de fichiers et cliquez sur "Avancé", modifiez l'association et dans la zone de texte "" c: \ program files \ myapp.exe ""% 1 "' –

Questions connexes