Codeby web-security - новый курс от Codeby Security School

Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...


Как программно получить путь к папке

В этой статье хотелось бы рассказать о способе, который позволяет программно получить путь к открытой в данный момент пользователем папке или директории, а так же избавится от элемента управления FolderBrowserDialog.

стандартный способ получить путь к папке

Очень часто бывает, что в своём приложении вы не можете заранее прописать точный путь к папке или директории, так как он может быть постоянно изменяемым, либо вообще не известен. Поэтому обычно в таких случаях в приложения добавляют control FolderBrowserDialog, благодаря которому пользователь сам указывает путь к папке или директории.

FolderBrowserDialog

Мы же в своём приложении можем получить выбранный пользователем путь, используя свойство SelectedPath.

string path = folderBrowserDialog1.SelectedPath;

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

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

Как пользователь определяет, нужно выполнить сортировку или нет?

Сначала он открывает папку, оценивает количество файлов и какие то другие параметры, после чего принимает какое-то решение. Если, к примеру, решение положительное, то он запускает нашу программу, которая первое, что предлагает ему сделать, это выбрать папку, которая уже открыта (выбрана), что выглядит не совсем логично. При этом пользователь, каждый раз тратит своё время и если будет программа, которая будет, выполнять это же действие быстрее он отдаст предпочтение ей. Поэтому в данном примере, нужно изменить интерфейс программы, чтобы избавить пользователя от повторной работы.

новый способ получить путь к папке

И так для начала сделаем запуск программы быстрым и удобным. Для этого добавим возможность вызова нашего приложения из контекстного меню, которое возникает при нажатии правой кнопки мыши.

меню

Плюсы:

1. Меню можно вызывать в любом месте.

2. Из него можно запустить любую программу.

3. Затраты по времени, которые мы тратим на вызов программы минимальны.

Добавление нового пункта меню

И так для начала добавим в меню новый пункт, при нажатии на который будет запускаться наша программа.

Открываем редактор реестра regedit.

1. Переходим по указанному пути

HKEY_CLASSES_ROOT\Directory\Background\shell

2. Создаем новый раздел с любым именем, например cleaning. Это название будет отображаться в контекстном меню по умолчанию.

3. В созданном разделе создадим подраздел по имени command.

корневые ключи

добавленные разделы


Paranoid - курс от Codeby Security School

Представляем вашему вниманию курс от команды codeby - "Комплекс мер по защите персональных данных, анонимности в интернете и не только" Подробнее ...


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

774

Когда требуется программно установить значение для параметра по умолчанию, то вместо имени можно просто указать две кавычки.

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 и нажать правую кнопку мыши.

скрытый пункт меню

Читайте также:


Codeby Market от Сodeby

Мы запустили свой магазин CodebyMarket Equipment for InfoSec. Уже добавили RaspberryAlfa Long-RangeOrange PiArduino и многое другое. Купить Pentesting Devices