Как программно получить путь к папке
В этой статье хотелось бы рассказать о способе, который позволяет программно получить путь к открытой в данный момент пользователем папке или директории, а так же избавится от элемента управления FolderBrowserDialog.
стандартный способ получить путь к папке
Очень часто бывает, что в своём приложении вы не можете заранее прописать точный путь к папке или директории, так как он может быть постоянно изменяемым, либо вообще не известен. Поэтому обычно в таких случаях в приложения добавляют control FolderBrowserDialog, благодаря которому пользователь сам указывает путь к папке или директории.
Мы же в своём приложении можем получить выбранный пользователем путь, используя свойство SelectedPath.
string path = folderBrowserDialog1.SelectedPath;
Но использование данного элемента управления не всегда может быть уместным.
Например, у нас есть программа, которая выполняет сортировку файлов. После её запуска пользователь должен выполнить всего лишь одно действие выбрать с помощью диалогового окна папку, в которой нужно выполнить сортировку, ничего сложно, но есть одно но.
Как пользователь определяет, нужно выполнить сортировку или нет?
Сначала он открывает папку, оценивает количество файлов и какие то другие параметры, после чего принимает какое-то решение. Если, к примеру, решение положительное, то он запускает нашу программу, которая первое, что предлагает ему сделать, это выбрать папку, которая уже открыта (выбрана), что выглядит не совсем логично. При этом пользователь, каждый раз тратит своё время и если будет программа, которая будет, выполнять это же действие быстрее он отдаст предпочтение ей. Поэтому в данном примере, нужно изменить интерфейс программы, чтобы избавить пользователя от повторной работы.
новый способ получить путь к папке
И так для начала сделаем запуск программы быстрым и удобным. Для этого добавим возможность вызова нашего приложения из контекстного меню, которое возникает при нажатии правой кнопки мыши.
Плюсы:
1. Меню можно вызывать в любом месте.
2. Из него можно запустить любую программу.
3. Затраты по времени, которые мы тратим на вызов программы минимальны.
Добавление нового пункта меню
И так для начала добавим в меню новый пункт, при нажатии на который будет запускаться наша программа.
Открываем редактор реестра regedit.
1. Переходим по указанному пути
HKEY_CLASSES_ROOT\Directory\Background\shell
2. Создаем новый раздел с любым именем, например cleaning. Это название будет отображаться в контекстном меню по умолчанию.
3. В созданном разделе создадим подраздел по имени command.
При создании нового ключа автоматически создается так называемый параметр по умолчанию, так же он может иметь имя Default, если у вас английская версия Windows. В качестве значения для данного параметра указываем полный путь к файлу запуска нашей программы.
Когда требуется программно установить значение для параметра по умолчанию, то вместо имени можно просто указать две кавычки.
regKey.SetValue("","значение");
Теперь для проверки можно нажать в любом месте правую кнопку мыши и в меню должен появиться новый пункт cleaning.
Исходный код, который проделает всё выше описанное.
static void Main (string [] args) { //основной ключ string key = @"Directory\Background\shell"; //имя пункта меню string name = "сleaning"; //путь к сборке, которая должна быть запущена string pathToAssembly = @"C:\MyProg\Cleaning.exe"; RegistryKey regKey; try { using(regKey = Registry.ClassesRoot.OpenSubKey(key, true)) { if (regKey != null) { //чтоб не перезаписать лишнего if (regKey.OpenSubKey(name) != null) { Console.WriteLine("имя уже существует"); } else regKey.CreateSubKey(name).CreateSubKey("command") .SetValue("", pathToAssembly); } } catch (Exeption ex) { MessageBox.Show(ex.Message); } }
Получение пути
Теперь нужно получить полный путь к открытой в данный момент папке. Для этого сначала удалим из нашей программы FolderBrowserDialog, а затем в событие Form_Load поместим следующий код
string curDir = Environment.CurrentDirectory;
либо
string curDir = Directory.GetCurrentDirectory();
Оба делают одно и тоже.
было
string curPath; private void button1_Click( object sender, EventArgs e) { if (DialogResult.OK == fldBrws.ShowDialog()) { curPath = fldBrws.SelectedPath; } }
стало
string curPath; private void Form1_Load( object sender, EventArgs e) { curPath = Environment.CurrentDirectory; }
Осталось поместить файл сборку нашего приложения в выше указанную папку C:\MyProg, вообще можно поместить файл куда угодно главное не забыть, потом изменить путь в реестре. Всё.
Бонус
Если Вы хотите, чтобы пункт меню был на русском языке, то добавьте параметр типа: REG_SZ (строковый параметр) с именем MUIVerb и укажите для него любое значение.
результат
Чтобы пользователь случайно не выполнил запуск программы не в той папке, можно сделать пункт меню скрытым. Для этого нужно добавить строковый параметр Extended значение для него указывать не нужно. Чтобы увидеть скрытый пункт меню нужно зажать клавишу Shift и нажать правую кнопку мыши.
Читайте также:
Здравствуйте! Спасибо за стать! Все ясно и понятно. А как сделать так чтобы параметр отвечающий за язык определялся в зависимости от языка ОС? То есть, если ос английский то автоматом на английский язык.
MUIVerb?
Можно подписаться на событие Form_InputLanguageChanged:
Но, это работает, только после запуска Windows Forms приложения. regKey должен содержать путь к параметру MUIVerb.