我有一个我编写的文本编辑器,它在过去一个月里一直运行良好,没有任何问题.但今天,一切昨日,每次我打开从资源管理器(双击它)一个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)将这些参数重新结合在一起.
您发布的代码不处理程序生成的任何异常(如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中),则可以单步执行代码,直到看到抛出的异常为止.
| 归档时间: |
|
| 查看次数: |
9903 次 |
| 最近记录: |