2009-10-13 16 views
5

Tengo un editor de texto que hice, que ha funcionado perfectamente durante el último mes sin ningún problema. Pero hoy en día, y todo el día de ayer, cada vez que abren un archivo txt desde el explorador (doble clic) en lugar de que la apertura de mi editor, aparece un mensaje diciendo:Mi aplicación se bloquea con una excepción FileNotFoundException, y no entiendo por qué

Editor de texto ha detectado un problema y debe cerca. Lo sentimos por este inconveniente. [Enviar informe de errores] o [No enviar].

Cuando hago clic en "Lo que hace este informe de errores contiene", se muestra lo siguiente:

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 

Así que básicamente me dice que su búsqueda de un archivo que no existe. Pero aquí está mi problema:
El archivo que estoy tratando de abrir sí existe porque acabo de hacer doble clic en él

Aquí está el código que abre un archivo que se ha hecho doble clic desde el explorador 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()); 
     } 
    } 
} 

Respuesta

58

La ruta en la que hace doble clic probablemente contenga uno o más espacios, lo que hace que la ruta se envíe como varios argumentos de línea de comandos.

Debe cambiar la asociación .txt para enviar la ruta entre comillas y/o cambiar su aplicación para leer todos los argumentos de la línea de comandos y combinarlos con espacios.

Explorer está enviando un comando como

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

Dado que no hay comillas alrededor de la cadena, se interpreta como 4 parámetros diferentes separadas por espacios.

Puede cambiar la asociación de los archivos .txt al YourApp.exe "%1" (con el %1 entre comillas) para forzar que toda la cadena se trate como un solo argumento.

O bien, puede reemplazar args[0] con String.Join(" ", args) para volver a armar los argumentos.

+1

La última sugerencia se desglosa para nombres de archivos con más de un espacio en una fila, entre otros. Simplemente citando el nombre de ruta es el camino a seguir. –

3

Obviamente tiene un error: acceder al archivo incorrecto.

Si no puede depurar el error en la máquina dada, descargue y use FileMon de sysinernals y vea a qué archivo accede su editor.

8

El código que ha publicado no maneja ninguna excepción (como FileNotFoundException) que genere su programa. Es por eso que obtienes la caja "AppCrash" fea e inútil. Como paso depuración, trate de envolver el código problemático en un bloque try/catch, así:

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

Esto le dirá, al menos, el método que está fallando. Construya en modo de depuración, y ejecute desde la línea de comandos con su archivo .pdb en el mismo directorio, y obtendrá el número de línea que falla.

Además, intente imprimir la ruta que está intentando abrir (usando MessageBox, o Console.WriteLine() desde la línea de comandos). Es posible que vea algo extraño. Parece que ha asociado un tipo de archivo con su aplicación y está ejecutando su aplicación haciendo doble clic en un archivo. El shell puede estar cambiando la ruta a ese archivo de una manera que no espera; imprimir el camino te dirá eso.

Si aún está atascado, publique el seguimiento de la pila resultante. También sería útil publicar un código de aplicación completo e independiente que demuestre el problema. El ejemplo de código que publicó está cerca, pero tiene una dependencia en Form1. AU $ 10 dice que en el proceso de hacer esto, tendrás un momento "Eureka" y verás el problema.

Alternativamente, si tiene acceso a un depurador (en Visual Studio), puede recorrer el código hasta que vea la excepción lanzada.

+1

De acuerdo. Además, si construye en un bloque catch-everything y lo acaba de cerrar sesión en el registro de eventos, puede dejarlo en el código de producción, y proporcionará comentarios útiles en caso de que tenga otras fallas en el campo. –

+0

gracias Micahel, intenté tu camino, y cuando trato de abrir el archivo desde el explorador, la excepción se muestra en un mensaje que dice "No se pudo encontrar el archivo 'C: \ Documents'. Aunque el archivo está realmente adentro:" C: \ Documents and Settings \ User \ My Documents \ file.txt "... así que estoy pensando que tiene algo que ver con que el filepath tenga más de un espacio en él, como Slaks mencionado a continuación? –

+0

Sí, suena La forma más fácil de arreglar esto es arreglar la asociación de archivos. Asumiendo <= WindowsXP, vaya a Opciones de carpeta, Tipos de archivos, encuentre su asociación de archivos y haga clic en "Avanzado", edite la asociación y en el cuadro de texto debajo de "Aplicación utilizado para realizar acciones ", asegúrese de que el% 1 tenga comillas a su alrededor. Al final obtendrá algo como: '" c: \ archivos de programa \ myapp.exe ""% 1 "' –

Cuestiones relacionadas