6

I have a text editor I made, which has been working perfectly for the past month without any problems. But today, and all of yesterday, every time I open a txt file from explorer (double clicking it) instead of it opening in my editor, a message appears saying:

Text Editor has encountered a problem and needs to close. We are sorry for this inconvenience. [Send error report] or [Don't send].

When I click on "What does this error report contain", it shows the following:

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

So that basically tells me that its looking for a file that doesn't exist. But here's my problem:
The file I am trying to open DOES exist because I just double clicked on it

Here is the code that opens a file that has been double clicked on from windows explorer:

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());
        }
    }
}
Robert Harvey
  • 178,213
  • 47
  • 333
  • 501
jay_t55
  • 11,362
  • 28
  • 103
  • 174

3 Answers3

61

The path you're double-clicking on probably contains one or more spaces, causing the path to be sent as multiple command line arguments.

You need to change the .txt association to send the path in quotes and/or change your app to read all command line arguments and combine them with spaces.

Explorer is sending a command such as

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

Since there aren't any quotes around the string, it's interpreted as 4 different parameters separated by spaces.

You can change the association for .txt files to YourApp.exe "%1" (with the %1 in quotes) to force the entire string to be treated as one argument.

Alternatively, you could replace args[0] with String.Join(" ", args) to put the arguments back together again.

Robert Harvey
  • 178,213
  • 47
  • 333
  • 501
SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
  • 5
    The last suggestion breaks down for file names with more than one space in a row, amongst others. Simply quoting the path name is the way to go. – Just a student Sep 25 '17 at 09:02
8

The code you posted doesn't handle any exceptions (like FileNotFoundException) that your program generates. That's why you get the ugly, unhelpful "AppCrash" box. As a debugging step, try wrapping the problematic code in a try/catch block, like so:

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

This will tell you, at least, the method that's failing. Build in debug mode, and run from the command-line with your .pdb file in the same directory, and you'll get the failing line number.

Also, try printing the path you're trying to open (using MessageBox, or Console.WriteLine() from the commandline). You might see something odd. It sounds like you've associated a file type with your application, and are running your app by double-clicking on a file. The shell might be changing the path to that file in a way you don't expect; printing the path will tell you that.

If you're still stuck, post the resulting stack trace. It would also be helpful to post complete, self-contained application code that demonstrates the problem. The code sample you posted is close, but has a dependency on Form1. AU$10 says that in the process of doing this, you'll have a "Eureka" moment and see the problem.

Alternatively, if you have access to a debugger (in Visual Studio), you can step through the code until you see the exception thrown.

Michael Petrotta
  • 59,888
  • 27
  • 145
  • 179
  • 1
    Agreed. Also, if you build in a catch-everything block and just have it log out to the event log, you can leave it in the production code, and it will provide useful feedback in case you have other failures in the field. – Daniel Pryden Oct 14 '09 at 00:24
  • thank you Micahel, i tried your way, and when i try to open the file from explorer, the exception is displayed in a messagebox saying "Could not find file 'C:\Documents'. Even though the file is actually inside: "C:\Documents and Settings\User\My Documents\file.txt" ..so, i'm thinking it has something to do with the filepath having more than one space in it, like Slaks mentioned below?. – jay_t55 Oct 14 '09 at 00:47
  • Yep, sounds like it. The easiest way to fix this is to fix the file association. Assuming <= WindowsXP, go to Folder Options, File Types, find your file association and click "Advanced", edit the association, and in the textbox under "Application used to perform action", ensure that the %1 has quotes around it. You'll end up with something like: '"c:\program files\myapp.exe" "%1"' – Michael Petrotta Oct 14 '09 at 00:56
  • What, exactly, is the file association string? Post it here, maybe it'll provide a clue. – Michael Petrotta Oct 14 '09 at 01:09
3

Obviously you have a bug: accessing the wrong file.

If you can't debug the error on the given machine, download and use FileMon from sysinernals and see what file is being accessed by you editor.

Amirshk
  • 8,170
  • 2
  • 35
  • 64