我的应用程序崩溃与FileNotFoundException,我不明白为什么

jay*_*t55 6 c# exception

我有一个我编写的文本编辑器,它在过去一个月里一直运行良好,没有任何问题.但今天,一切昨日,每次我打开从资源管理器(双击它)一个txt文件,而不是它开在我的编辑,会出现一条消息说:

文本编辑器遇到问题,需要关闭.对于给您带来的不便,我们深表歉意.[发送错误报告]或[不发送].

当我点击"此错误报告包含什么"时,它显示以下内容:

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
Run Code Online (Sandbox Code Playgroud)

所以这基本上告诉我它正在寻找一个不存在的文件.但这是我的问题:
我试图打开的文件存在,因为我只是双击它

以下是打开从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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 61

您双击的路径可能包含一个或多个空格,导致路径作为多个命令行参数发送.

您需要更改.txt关联以在引号中发送路径和/或更改应用程序以读取所有命令行参数并将它们与空格组合.

资源管理器正在发送命令,如

YourApp.exe C:\Documents and Settings\YourName\My Documents\YourFile.txt
Run Code Online (Sandbox Code Playgroud)

由于字符串周围没有任何引号,因此它被解释为由空格分隔的4个不同参数.

您可以将.txt文件的关联更改为YourApp.exe "%1"(使用%1引号)以强制将整个字符串视为一个参数.

或者,您可以替换args[0]String.Join(" ", args)将这些参数重新结合在一起.

  • 最后一个建议分解为连续多个空格的文件名等.简单地引用路径名就是要走的路. (2认同)

Mic*_*tta 8

您发布的代码不处理程序生成的任何异常(如FileNotFoundException).这就是为什么你得到丑陋,无益的"AppCrash"盒子.作为调试步骤,尝试将有问题的代码包装在try/catch块中,如下所示:

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

这将告诉你,至少,失败的方法.在调试模式下构建,并从命令行运行同一目录中的.pdb文件,您将获得失败的行号.

另外,尝试打印您尝试打开的路径(使用命令行中的MessageBox或Console.WriteLine()).你可能会看到奇怪的东西.听起来您已将文件类型与应用程序相关联,并通过双击文件来运行应用程序.shell可能会以您不期望的方式更改该文件的路径; 打印路径会告诉你.

如果您仍然卡住,请发布生成的堆栈跟踪.发布演示该问题的完整,自包含的应用程序代码也会很有帮助.您发布的代码示例很接近,但依赖于Form1.10澳元表示,在这样做的过程中,你将有一个"尤里卡"时刻,看看问题.

或者,如果您可以访问调试器(在Visual Studio中),则可以单步执行代码,直到看到抛出的异常为止.