Запускать программу для работы с файлом при двойном клике на файл

266
09 ноября 2017, 03:07

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

Answer 1

Program.cs

static class Program
{
    /// <summary>
    /// Главная точка входа для приложения.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        //с аргументами (пользователь открыл файл с помощью программы)
        MainForm f = null;
        if (args != null && args.Length > 0)
        {
            string fileName = args[0];
            //Существует ли файл?
            if (System.IO.File.Exists(fileName))
            {
                f = new MainForm (fileName);
            }
            //Файл не существует :(
            else
            {
                MessageBox.Show("File does not exist!", "Error!",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                f = new MainForm();
            }
        }
        //без аргументов
        else
        {
            f = new MainForm();
        }
        Application.Run(f);
    }
}

Главная форма MainForm.cs

    public MainForm()
    {
        InitializeComponent();
    }
    public MainForm(string filename)
    {
        InitializeComponent();
        openFile(filename);
    }
    private openFile(string filename)
    {
        //ваша логика для открытия файла
    }

Если нужна ещё и возможность перетаскивания файлов на форму, нужно завести обработчики событий DragEnter и DragDrop

void MainForm_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (isFileValid (files[0]))
        {
            e.Effect = DragDropEffects.Copy;
        }
    }
}
void MainForm_DragDrop(object sender, DragEventArgs e)
{
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
    if (isFileValid(files[0]))
    {
        e.Effect = DragDropEffects.Copy;
        openFile(files[0]);
    }
}
private bool isFileValid(string filename)
{
    //Проверяем, что можем принять такой файл
    // например, просто по расширению
    return Path.GetExtension(filename) == ".myextension";
}
READ ALSO
Экспорт таблицы из Excel в Word файл

Экспорт таблицы из Excel в Word файл

Столкнулся с трудностью, нужно экспортировать таблицу из excel файла в wordМожет кто подсказать, как это реализовать? (может быть у кого нибудь...

214
Как создать список с помощью Value Tuple

Как создать список с помощью Value Tuple

Добавил через NuGet SystemValueTuple

222
Читать все txt файлы из папки

Читать все txt файлы из папки

Есть папка, в ней 5 txt файлов, задача софта чтобы он искал строку во всех файлах(пусть показывает файл и строку, которую нашел), пока что у меня...

276
Как улучшить или чем заменить Spreadsheetgear

Как улучшить или чем заменить Spreadsheetgear

Я использую SSG, WinForm, NET для DesktopСтолкнулся со следующими проблемами:

227