繁体   English   中英

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

[英]My application crashes with a FileNotFoundException, and I don't understand why

我有一个我编写的文本编辑器,它在过去一个月里一直运行良好,没有任何问题。 但今天和昨天的每一天,每次我从资源管理器中打开一个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

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

以下是打开从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());
        }
    }
}

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

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

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

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

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

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

或者,您可以使用String.Join(" ", args)替换args[0]以将参数重新组合在一起。

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

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

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

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

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

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

显然你有一个错误:访问错误的文件。

如果无法在给定计算机上调试错误,请从sysinernals下载并使用FileMon,并查看编辑器正在访问的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM