Что делать после сохранения файла, чтобы избежать System.IO.DirectoryNotFoundException при попытке открыть его немедленно - PullRequest
0 голосов
/ 06 мая 2019

У меня есть приложение Winforms, которое создает JSON из значений, введенных пользователем, а затем сохраняет в виде текстового файла.После сохранения файла имя файла (с путем) добавляется в полосу меню, чтобы пользователь мог легко получить доступ ко всем созданным файлам json.Если я нажимаю на полоску меню после сохранения файла, я получаю сообщение об ошибке «System.IO.DirectoryNotFoundException:« Не удалось найти часть пути ».Однако, если я перезапущу приложение и нажму на путь к файлу в строке меню, файл откроется без проблем.Я предполагаю, что даже если файл существует, что-то может «все еще разрешаться» или что-то, потому что это происходит, только если я пытаюсь получить к нему доступ во время той же «сессии», в которой был создан файл.

Я сохраняю файл следующим образом:

            using (StreamWriter file = File.CreateText(filePath))
        {
            file.Write(json);
        }

Я добавляю путь к меню следующим образом:

        private void AddToApiMenu(string testName, string filePath)
    {
        Form1 frm = new Form1();
        foreach (ToolStripMenuItem item in Form1.menuStrip.Items)
        {
            if (item.Text == "Saved Tests")
            {
                foreach (ToolStripMenuItem subitem in item.DropDownItems)
                {
                    if (subitem.Text == "Current Api Key")
                    {
                        ToolStripMenuItem newItem = new ToolStripMenuItem();
                        newItem.Name = testName;
                        newItem.Text = testName;
                        newItem.Tag = filePath;
                        newItem.Click += new EventHandler(frm.MenuItemClickHandler);
                        subitem.DropDownItems.Add(newItem);
                    }
                }
            }
        }
    }

Используя это событие нажатия пункта меню,Я открываю файл следующим образом:

using (StreamReader r = new StreamReader(filePath))
        {
            json = r.ReadToEnd();
            testCall = JsonConvert.DeserializeObject<TestModel>(json);
        }

Это место, где / когда я получаю сообщение об ошибке.

Кто-то запросил увидеть полный код обработчика события, вот он:

 public void MenuItemClickHandler(object sender, EventArgs e)
    {
        ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender;
        string filePath = clickedItem.Tag.ToString();
        string jsonFile;
       if(filePath.Contains("Sequences"))
        {
            OpenSequence frm = new OpenSequence(filePath);
            frm.Show();
            FormState.PreviousPage = this;
        }
       else if(filePath.Contains("Tests"))
        {
            OpenTest openTest = new OpenTest(filePath);
            openTest.Show();
            FormState.PreviousPage = this;

        }
       else if(filePath == "mFile")
        {
            DialogResult result = openFileDialog1.ShowDialog();
            dynamic call;
            if (result == System.Windows.Forms.DialogResult.OK)
            {
                jsonFile = Path.GetFullPath(openFileDialog1.FileName);

                if(jsonFile != null)
                {
                    using (StreamReader r = new StreamReader(jsonFile))
                    {
                        jsonFile = r.ReadToEnd();
                        call  = JsonConvert.DeserializeObject<dynamic>(jsonFile);
                    }

                    if(call.SequenceName != null)
                    {
                        OpenSequence frm = new OpenSequence(openFileDialog1.FileName);
                        frm.Show();
                        FormState.PreviousPage = this;
                    }
                    else if(call.MethodName !=null)
                    {
                        OpenTest openTest = new OpenTest(openFileDialog1.FileName);
                        openTest.Show();
                        FormState.PreviousPage = this;

                    }
                }

            }


        }
    }

Есть ли что-то, что я должен / могу сделать после выполнения file.Write, чтобы сделать этот файл немедленно доступным из полосы меню без получения не найденного исключения?

Любая помощьс благодарностью.

1 Ответ

0 голосов
/ 07 мая 2019

Попробуйте этот код:

if(!File.Exists(FilePath))
{
    File.Create(FilePath).Close();
}
//Open file code

Источник: Невозможно получить доступ к только что созданному файлу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...