Как правильно прописать путь к файлу Word в проекте?

Рейтинг: 0Ответов: 1Опубликовано: 05.08.2023

Пытаюсь сделать экспорт ключей из формы в документ сам экспорт получился но вот с путем в файл проблема, помогите разобраться что не так. Вот мой код:

private void add_word_Click(object sender, EventArgs e)
    {
        var wordApp = new Word.Application();
        try
        {
            string text_p = number_p.Text;
            string text_g = number_g.Text;
            string text_y = number_y.Text;
            string filepath = @"\Диссертация\проект\Алгоритм шифрования Эль-Гамаля\El-Gamal\El-Gamal\Public_keys\public.docx";
            if (!File.Exists(filepath))
            {
                MetroFramework.MetroMessageBox.Show(this, "Файл шаблона не найден.", "Ошибка");
                return;
            }
            var doc = wordApp.Documents.Open(filepath);
            doc.Content.Find.Execute(FindText: "{p}", ReplaceWith: text_p);
            doc.Content.Find.Execute(FindText: "{g}", ReplaceWith: text_g);
            doc.Content.Find.Execute(FindText: "{y}", ReplaceWith: text_y);
            string outpath = @"\Диссертация\проект\Алгоритм шифрования Эль-Гамаля\El-Gamal\El-Gamal\Public_keys\public_out.docx";
            doc.SaveAs2(outpath);
            doc.Close();

            MetroFramework.MetroMessageBox.Show(this, "Ключи успешно экспортированы", "Уведомление");
        }
        catch (Exception ex)
        {
            MetroFramework.MetroMessageBox.Show(this, $"Произошла ошибка - {ex.Message}", "Уведомление");
        }
        finally
        {
            wordApp.Quit();
        }
    }

по итогу компилирования выходит такая ошибка: введите сюда описание изображения

а если я к пути добавляю букву тома флешки, где и находится мой проект, то работает все нормально. Вот я хочу без буквы тома флешки сделать путь к файлу, ведь буква тома может меняться в разных пк. А и еще хочу обойтись без проводника, чтоб через проводник открывать файл. Просто по нажатию кнопки числа вставились в шаблон копию шаблона документа, высветилось сообщение и все, и чтоб он сразу определял файл без проводника. Заранее спасибо за совет и помощь в целом.

Ответы

▲ 0Принят

Хардкод путей - не очень хорошая история, освойте OpenFileDialog и SaveFileDialog.

Для работы с путями есть великолепный класс System.IO.Path, а текущий диск можно достать из Environment.CurrentDirectory.

private void add_word_Click(object sender, EventArgs e)
{
    var wordApp = new Word.Application();
    try
    {
        string text_p = number_p.Text;
        string text_g = number_g.Text;
        string text_y = number_y.Text;
        const string dir = @"\Диссертация\проект\Алгоритм шифрования Эль-Гамаля\El-Gamal\El-Gamal\Public_keys";
        string filepath = Path.Combine(Environment.CurrentDirectory, dir, "public.docx");
            
        var doc = wordApp.Documents.Open(filepath);
        doc.Content.Find.Execute(FindText: "{p}", ReplaceWith: text_p);
        doc.Content.Find.Execute(FindText: "{g}", ReplaceWith: text_g);
        doc.Content.Find.Execute(FindText: "{y}", ReplaceWith: text_y);
        string outpath = Path.Combine(Path.GetDirectoryName(filepath), "public_out.docx");
        doc.SaveAs2(outpath);
        doc.Close();

        MetroFramework.MetroMessageBox.Show(this, "Ключи успешно экспортированы", "Уведомление");
    }
    catch (Exception ex)
    {
        MetroFramework.MetroMessageBox.Show(this, $"Произошла ошибка - {ex.Message}", "Уведомление");
    }
    finally
    {
        wordApp.Quit();
    }
}

Нет никакого смысла здесь проверять File.Exists, это ненадёжно и бессмысленно. И как вы уже заметили, это не работает.