我有一个我制作的文本编辑器,它在过去一个月里一直运行良好,没有任何问题。但是今天和昨天,我每次从资源管理器中打开一个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());
}
}
}
答案 0 :(得分:60)
您双击的路径可能包含一个或多个空格,导致路径作为多个命令行参数发送。
您需要更改.txt
关联以在引号中发送路径和/或更改您的应用以读取所有命令行参数并将它们与空格组合。
资源管理器正在发送诸如
之类的命令YourApp.exe C:\Documents and Settings\YourName\My Documents\YourFile.txt
由于字符串周围没有引号,因此它被解释为由空格分隔的4个不同参数。
您可以将.txt
文件的关联更改为YourApp.exe "%1"
(引号中的%1
),以强制将整个字符串视为一个参数。
或者,您可以将args[0]
替换为String.Join(" ", args)
,以便将参数重新组合在一起。
答案 1 :(得分:8)
您发布的代码不处理程序生成的任何异常(如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中),则可以单步执行代码,直到看到抛出的异常为止。
答案 2 :(得分:3)
显然你有一个错误:访问错误的文件。
如果您无法在给定计算机上调试错误,请从sysinernals下载并使用FileMon 并查看您的编辑器正在访问的文件。