При двойном щелчке связанного файла файл не открывается и происходит сбой программы

У меня особая проблема с открытием файла в связанной с ним программе. Сначала я дважды щелкаю файл, нажимаю «Открыть с помощью…», затем щелкаю по папке «Отладка» в файле проекта моей программы и запускаю исполняемый файл. Это имитирует открытие файла в связанной с ним программе, как если бы эта программа была действительно установлена ​​на моем компьютере.

Вот весь код из Program.cs:

namespace TriviaAuthor_v10
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmSplashScreen());
            if (args.Length > 0)
                Application.Run(new frmMain(args[0]));
            else
                Application.Run(new frmMain());
        }
    }
}

Теперь вот код двух конструкторов для главной формы:

    public frmMain(string autoopenfilepath)
    {
        InitializeComponent();
        filepath = autoopenfilepath;
        OpenTheFile(filepath);
    }

    public frmMain()
    {
        InitializeComponent();
    }

А вот код открытия файла:

    private void OpenTheFile(string ThisFilePath)
    {
        // First we get the filename.
        filename = Path.GetFileName(ThisFilePath);
        FilenameSansExtension = Path.GetFileNameWithoutExtension(ThisFilePath);
        // Create a file stream.
        FileStream fs = new FileStream(ThisFilePath, FileMode.Open, FileAccess.Read);
        // Create the writer for data.
        BinaryReader br = new BinaryReader(fs);
        GameInfo.GameTitle = br.ReadString();
        GameInfo.GameAuthor = br.ReadString();
        GameInfo.DateCreated = br.ReadString();
        GameInfo.NumberOfQuestions = br.ReadInt32();
        GameInfo.TitlePageImagePresent = br.ReadBoolean();
        GameInfo.TitlePageImage = br.ReadString();
        GameInfo.IntroScreenAudioPresent = br.ReadBoolean();
        GameInfo.IntroScreenAudio = br.ReadString();
        GameInfo.FinalScoreAudioPresent = br.ReadBoolean();
        GameInfo.FinalScoreAudio = br.ReadString();
        GameInfo.ActiveQuestion = br.ReadInt32();

        if (GameInfo.NumberOfQuestions > 0)
        {
            for (int i = 0; i < GameInfo.NumberOfQuestions; i++)
            {
                clsQuestionClass Question = new clsQuestionClass();

                Question.NewQuestion = br.ReadString();
                Question.Points = br.ReadInt32();
                Question.QuestionType = br.ReadInt32();
                Question.QuestionImagePresent = br.ReadBoolean();
                Question.QuestionImage = br.ReadString();

                Question.QuestionAudioPresent = br.ReadBoolean();
                Question.QuestionAudio = br.ReadString();

                Question.IncludeTimer = br.ReadBoolean();
                Question.TimerTime = br.ReadInt32();
                Question.TickTock = br.ReadBoolean();

                Question.AIsChecked = br.ReadBoolean();
                Question.AnswerA = br.ReadString();
                Question.AIsCorrect = br.ReadBoolean();

                Question.BIsChecked = br.ReadBoolean();
                Question.AnswerB = br.ReadString();
                Question.BIsCorrect = br.ReadBoolean();

                Question.CIsChecked = br.ReadBoolean();
                Question.AnswerC = br.ReadString();
                Question.CIsCorrect = br.ReadBoolean();

                Question.DIsChecked = br.ReadBoolean();
                Question.AnswerD = br.ReadString();
                Question.DIsCorrect = br.ReadBoolean();

                Question.TrueOrFalse = br.ReadBoolean();

                Question.FillInBlankAnswer = br.ReadString();

                Question.AnswerResponseImagePresent = br.ReadBoolean();
                Question.AnswerResponseImage = br.ReadString(); ;
                Question.CorrectAnswerResponse = br.ReadString();
                Question.IncorrectAnswerResponse = br.ReadString();

                Question.CorrectAnswerResponseAudioPresent = br.ReadBoolean();
                Question.CorrectAnswerResponseAudio = br.ReadString();
                Question.IncorrectAnswerResponseAudioPresent = br.ReadBoolean();
                Question.IncorrectAnswerResponseAudio = br.ReadString();

                Questions.Add(Question);
                Questions.Count();
            }
        }
        fs.Close();
        br.Close();
        QuestionIndex = GameInfo.ActiveQuestion;
        LoadGameIntoGameGUI(Questions[QuestionIndex]);
        this.Text = "Trivia Author v1.0 - " + FilenameSansExtension;
        ProjectNeedsSaving = false;
        saveAsToolStripMenuItem.Enabled = closeprojecttoolStripMenuItem1.Enabled = exportgametoolStripMenuItem.Enabled =
        printToolStripMenuItem.Enabled = printPreviewToolStripMenuItem.Enabled = tsbtnProjectClose.Visible =
        ProjectIsOpen = saveToolStripMenuItem.Enabled = tsbtnSaveProject.Enabled = btnShowProjectReview.Enabled = true;

        UpdateGameSummary();
    }

Примечание. «OpenTheFile(string ThisFilePath)» используется как для открытия файла с помощью диалогового окна OpenFileDialog, так и для попытки открыть файл двойным щелчком по нему.

Итак, вот проблема: когда я запускаю программу в Visual Studio 2013, а затем открываю файл (используя OpenFileDialog), файл открывается без проблем. Но когда я пытаюсь открыть файл, дважды щелкнув его и открыв с помощью исполняемого файла в папке отладки программы, я вижу заставку программы, а затем программа прерывается. Это

мне кажется, что путь к файлу правильно передается в «OpenTheFile ()». А поскольку программа работает вне Visual Studio, я не получаю сообщений об ошибках даже от операционной системы.


person manicdrummer    schedule 30.01.2015    source источник
comment
Что делает метод AutoOpenFile?   -  person Guffa    schedule 31.01.2015
comment
что происходит, когда вы выполняете код... видите ли вы что-нибудь, что сразу бросается в глаза, что может привлечь внимание к потенциальной проблеме...? Вы пытались добавить FileShare.Read к этой строке FileStream fs = new FileStream(ThisFilePath, FileMode.Open, FileAccess.Read);   -  person MethodMan    schedule 31.01.2015
comment
Вы можете использовать try catch с AutoOpenFile(filepath); и получить информацию об исключении (в файл или окно сообщения).   -  person Nadia Chibrikova    schedule 31.01.2015
comment
Прости за это, Гуффа. Я обновил его так, что AutoOpenFile() теперь OpenTheFile().   -  person manicdrummer    schedule 31.01.2015
comment
Прости за это, Гуффа. Я обновил его так, что AutoOpenFile() теперь OpenTheFile(). MethodMan: Добавление FileShare.Read не помогло. Надя: Я пробовала try-catch, но похоже, что программа вылетает до того, как MessageBox успевает отобразиться.   -  person manicdrummer    schedule 31.01.2015
comment
Используйте System.Diagnostics.Debugger.Launch(), теперь вы можете отлаживать его. Вы должны уделить некоторое внимание работе с необработанными исключениями, написать обработчик событий для AppDomain.CurrentDomain.UnhandledException и зарегистрировать или отобразить e.ExceptionObject.ToString().   -  person Hans Passant    schedule 31.01.2015
comment
Если вы используете отладочную версию программы, что она говорит во всплывающем окне с подробностями о том, что произошло? Вы открываете его с помощью каких-либо аргументов командной строки?   -  person Sayse    schedule 02.02.2015


Ответы (1)


Давай начнем сначала. Вы проверяете аргументы в самом начале вашего приложения. Если доходит до LoadGameIntoGameGUI() и там рушится (после чтения файла), значит что-то передается в программу. Поскольку вы упомянули, что добавили окно сообщения, я предполагаю, что теперь вы запускаете правильную версию программы, но у вас все еще есть исключение. Точно такое же исключение? Если да, не могли бы вы опубликовать свой код для LoadGameIntoGameGUI?

Кстати, if здесь не нужен, если GameInfo.NumberOfQuestions==0, цикл все равно будет проигнорирован:

 if (GameInfo.NumberOfQuestions > 0)
    {
        for (int i = 0; i < GameInfo.NumberOfQuestions; i++)

Что это за цифры и вопросы? Вы передаете один из них в LoadGameIntoGameGUI, вы уверены, что это правильно? Вы можете добавить файл журнала и проверить ввод. Что-то вроде File.WriteAllText("your log.txt", question.ToString()); (убедитесь, что ToString возвращает что-то осмысленное).

person Nadia Chibrikova    schedule 30.01.2015
comment
Спасибо, Надя, но у MessageBox не будет шанса показать. Я также попробовал пример по этой ссылке: tech.pro/tutorial /668/, но это тоже не сработало. Есть ли способ зарегистрировать необработанное исключение и сохранить его где-нибудь? Кроме того, код в Program.cs идентичен более ранней версии этого проекта, и файлы с двойным щелчком открываются в этой версии очень хорошо, поэтому мне интересно, если строка, содержащая путь к файлу (из args[0] в Program.cs ) не доходит до места назначения в основном файле программы (OpenTheFile() в frmMain.cs). - person manicdrummer; 31.01.2015
comment
Похоже, что исключение генерируется ОС, а не вашим приложением. Я пытался писать журнал после выполнения каждой строки кода, может быть, это что-то прояснит. Также вы можете закомментировать некоторые части вашего кода, начиная с тех, которые вы считаете подозрительными, чтобы увидеть, правы вы в них или нет. - person Nadia Chibrikova; 31.01.2015
comment
Другое дело - вы смотрели и журнал событий Windows? В этом может быть что-то. - person Nadia Chibrikova; 31.01.2015
comment
Надя: Я писала что-то о журнале событий Windows выше. Это было слишком долго, чтобы опубликовать здесь в качестве комментария. - person manicdrummer; 01.02.2015
comment
Надя: Щелкнув файл правой кнопкой мыши, я перехожу к C:\Users\Reuben\Documents\Visual Studio 2013\Projects\Visual C# 2013 Projects\Trivia Author v101 With FindActiveQuestion\BYOTG v10\bin\Debug\TriviaAuthor_v10.exe. В журнале событий указано C:\Users\Reuben\Documents\Visual Studio 2013\Projects\Visual C# 2013 Projects\Trivia Author v101 With AutoOpen2\BYOTG v10\bin\Debug\TriviaAuthor_v10.exe. Это неправильная папка, очевидно. Что я могу сделать, чтобы убедиться, что папка, к которой я перехожу, является той, в которой я в конечном итоге? - person manicdrummer; 02.02.2015
comment
Хм... переименуйте или удалите не тот файл. Также может помочь смена версии приложения в VS. - person Nadia Chibrikova; 02.02.2015
comment
Надя: Я пыталась переименовать и удалить не тот файл, но проблема осталась. Кроме того, мне удалось зафиксировать args.Length в Program.cs, передав его в frmSpashScreen и отобразив его там в MessageBox. args.Length имеет значение 0. Поскольку это значение получено из Program.cs, похоже, что путь к файлу не передается в Program.cs, когда я дважды щелкаю связанный файл. - person manicdrummer; 02.02.2015