Гид по технологиям

Создание простого файлового менеджера на Windows Forms

7 min read Разработка Обновлено 02 Jan 2026
Файловый менеджер на Windows Forms
Файловый менеджер на Windows Forms

Файлы и папки на полке с книгами

Что вы построите

Вы создадите простое приложение-файловый менеджер, которое содержит быстрые ссылки на системные папки (Рабочий стол, Документы, Изображения, Музыка, Видео). Приложение должно уметь:

  • показывать содержимое выбранной папки в панели;
  • переходить внутрь папок по клику;
  • открывать файлы по двойному клику (или по клик-обработчику);
  • возвращаться на уровень выше с помощью кнопки «Назад».

Ниже — подробная инструкция с готовыми фрагментами кода и пояснениями.

Как добавить элементы интерфейса на форму

  1. Создайте новый проект Windows Forms в Visual Studio.
  2. На форме (канвасе) через Toolbox найдите элемент Button и перетащите пять кнопок — каждая будет быстрой ссылкой на системную папку. Добавление пяти кнопок на холст WinForms с использованием панели инструментов
  3. Выделяйте по очереди каждую кнопку и в окне Свойств измените значения Name и Text. Name — идентификатор в коде (оставьте английские идентификаторы), Text — локализованный видимый текст. Рекомендуемые значения:
КнопкаName PropertyText Property
1button_DesktopРабочий стол
2button_DocumentsДокументы
3button_PicturesИзображения
4button_MusicМузыка
5button_VideosВидео
  1. Выделена кнопка для показа атрибута Text со значением Документы В Toolbox найдите FlowLayoutPanel и перетащите его на форму — он будет контейнером для списка файлов и папок.
  2. Переместите панель рядом с быстрыми ссылками и при необходимости измените её размер.
  3. Выделите панель и в окне Свойств задайте Name = panel_FilesList. Новая панель на холсте WinForms с именем panel_FilesList

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

Как получить текущий путь к папке

Когда пользователь нажимает кнопку «Рабочий стол» или «Документы», нужно получить строковый путь к системной папке и передать его в функцию отображения.

Напишите логику в коде формы (code-behind) на C#. Если вы ещё не знакомы с классами C#, — начните с базовой документации по классам.

  1. Двойной клик по каждой из пяти кнопок в дизайнере генерирует обработчики кликов в файле формы. Пример генерируемых методов:
private void button_Desktop_Click(object sender, EventArgs e)
{
}

private void button_Documents_Click(object sender, EventArgs e)
{
}

private void button_Pictures_Click(object sender, EventArgs e)
{
}

private void button_Music_Click(object sender, EventArgs e)
{
}

private void button_Videos_Click(object sender, EventArgs e)
{
}
  1. Для получения пути к специальной папке Windows используйте Environment.GetFolderPath(Environment.SpecialFolder.X). Эта функция возвращает строку пути, например “C:\Users\User\Desktop”. Добавьте вызов DisplayFiles(path) в каждый обработчик, а также вызов при инициализации формы, чтобы сразу показать содержимое по умолчанию:
public Form1()
{
    InitializeComponent();
    DisplayFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
}

private void button_Desktop_Click(object sender, EventArgs e)
{
    DisplayFiles(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
}

private void button_Documents_Click(object sender, EventArgs e)
{
    DisplayFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
}

private void button_Pictures_Click(object sender, EventArgs e)
{
    DisplayFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures));
}

private void button_Music_Click(object sender, EventArgs e)
{
    DisplayFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic));
}

private void button_Videos_Click(object sender, EventArgs e)
{
    DisplayFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos));
}

Примечание: в русифицированной версии Windows видимые названия папок могут отличаться, но Environment.SpecialFolder вернёт корректный физический путь.

Как отрисовать файлы выбранной директории

  1. Вверху файла добавьте пространство имён для работы с файловой системой:
using System.IO;
  1. Создайте функцию DisplayFiles(string filePath), которая будет собирать список директорий и файлов и создавать для них кнопки в panel_FilesList:
private void DisplayFiles(string filePath)
{
    // Code to display the files and folders inside the directory
}
  1. Внутри DisplayFiles соберите массив путей — сначала папки, затем файлы (или объедините оба массива):
string[] filesList = Directory.GetDirectories(filePath).Concat(Directory.GetFiles(filePath)).ToArray();
  1. Очистите панель от старых контролов:
panel_FilesList.Controls.Clear();
  1. Сохраните текущую директорию в глобальную переменную currentLocation, чтобы потом можно было реализовать кнопку назад:
currentLocation = filePath;
  1. Объявите глобальную переменную в начале класса формы (исправленная версия):
string currentLocation = "";
  1. Для каждого пути в filesList программно создайте кнопку с текстом — именем файла или папки. Ниже — пример реализации. В исходной версии исходный код имел циклическую ошибку (filesList.Length-1) — в исправленном примере цикл идёт по всем элементам. Также учитывайте скрытые файлы и папки и используйте File.GetAttributes:
for (int i = 0; i < filesList.Length; i++)
{
    bool isHidden = ((File.GetAttributes(filesList[i]) & FileAttributes.Hidden) == FileAttributes.Hidden);

    if (!isHidden)
    {
        // Get the name of the file from the path
        var startOfName = filesList[i].LastIndexOf("\\");
        var fileName = filesList[i].Substring(startOfName + 1, filesList[i].Length - (startOfName + 1));

        // Display the file or folder as a button
        Button newButton = new Button();
        newButton.Text = fileName;
        newButton.Name = filesList[i];
        newButton.Location = new Point(70, 70);
        newButton.Size = new Size(800, 100);
        newButton.TextAlign = ContentAlignment.MiddleLeft;
        newButton.Padding = new Padding(24, 0, 0, 0);
        panel_FilesList.Controls.Add(newButton);
    }
}
  1. Запустите проект (зелёная кнопка в Visual Studio). Зелёная кнопка запуска вверху проекта Visual Studio
  2. Нажмите любую из быстрых ссылок — панель должна заполниться списком файлов и папок выбранной системной директории. Список файлов и директорий в папке Документы во время выполнения
  3. При переключении на другую быструю ссылку список очищается и заполняется для новой папки. Список файлов и директорий в папке Видео во время выполнения

Совет по производительности: для больших папок лучше подгружать элементы порциями или использовать виртуализацию (например, ListView с виртуальным режимом), иначе создание сотен кнопок может тормозить UI.

Как реализовать навигацию вверх и вниз по папкам

  1. Создайте обработчик, который будет привязан к клику по каждой созданной программно кнопке. Этот обработчик определяет, является ли элемент директорией или файлом. Если это папка — вызывает DisplayFiles(path), если файл — открывает его через стандартную оболочку.

Исходный пример обработчика:

private void button_Click_Open(object sender, EventArgs e)
{
    Button button = (Button)sender;
    string filePath = button.Name;

    try
    {
        // If a directory clicked, reload list of files in new directory
        DisplayFiles(filePath);
    }
    catch (Exception ex)
    {
        // If file clicked, open the file
        var process = new System.Diagnostics.Process();
        process.StartInfo = new System.Diagnostics.ProcessStartInfo() { UseShellExecute = true, FileName = filePath };
        process.Start();
    }
}
  1. В момент создания каждой кнопки в DisplayFiles добавьте привязку обработчика:
newButton.Click += button_Click_Open;
  1. Для перехода вверх по дереву создайте кнопку Back на форме через Toolbox. Новая кнопка Назад, перетащенная на холст через панель инструментов
  2. В окне Свойств Text кнопки установите “< Back” или локализуйте как “< Назад”. Кнопка Назад переименована на холсте
  3. Двойной клик по кнопке создаст обработчик back_Click.
private void back_Click(object sender, EventArgs e)
{
}
  1. Внутри обработчика вычислите родительскую папку и вызовите DisplayFiles. Здесь важно учесть корневые директории и исключения:
var previousFolder = this.currentLocation.Substring(0, this.currentLocation.LastIndexOf("\\"));
DisplayFiles(previousFolder);
  1. Запустите приложение, кликайте по папкам внутри панели для перехода вниз, и по Back — чтобы подняться на уровень выше.

  2. При навигации внутрь папки список обновится и покажет содержимое вложенной директории. Список файлов и директорий после перехода внутрь папки

  3. Нажатие Back вернёт к предыдущему уровню. Список файлов и директорий для папки Изображения во время выполнения

Совет: обрабатывайте граничные случаи — когда в currentLocation нельзя найти символ “\” (например, для сетевых путей или корневых томов) — чтобы избежать исключений.

Улучшения и доработки интерфейса

  • Добавьте иконки для папок и файлов (ImageList + ListView или кастомные PictureBox внутри панели).
  • Реализуйте контекстное меню (ContextMenuStrip) с операциями: открыть, переименовать, удалить, свойства.
  • Добавьте строку состояния и индикатор загрузки для больших операций.
  • Поддержите перетаскивание (drag-and-drop) и копирование/вставку.

Когда этот подход не подходит

  • Для очень больших директорий (тысячи файлов) динамическое создание кнопок сильно замедлит UI. Используйте виртуализированные контролы (ListView в виртуальном режиме, DataGridView с виртуализацией).
  • Для современных приложений с адаптивным интерфейсом или анимациями лучше подойдёт WPF или WinUI.
  • Если нужно кросс‑платформенное приложение — рассматривать Electron, Avalonia, MAUI.

Альтернативные подходы

  • WPF: поддерживает декларативный XAML, привязки данных и виртуализацию списка.
  • WinUI / UWP: современный интерфейс и интеграция с Windows 10/11 компонентами.
  • .NET MAUI / Avalonia: кросс‑платформенные решения для настольных и мобильных приложений.

Ментальные модели и эвристики

  • «Отделяй представление от логики»: UI только отображает набор путей; вся логика навигации и работы с файлами должна быть в отдельных методах/сервисах.
  • «Загружай только то, что нужно»: ленивые операции и пагинация для больших наборов.
  • «Предотвращай потерю данных»: перед удалением файлов всегда подтверждайте действие пользователем.

Чек-лист ролей

Developer:

  • Обработка исключений при доступе к файлам
  • Проверка прав доступа (UnauthorizedAccessException)
  • Виртуализация при больших директориях

Tester:

  • Проверить навигацию в корневых и сетевых папках
  • Тест на файлы с длинными именами и пробелами
  • Убедиться, что открытие файлов запускает связанное приложение

Designer:

  • Контрастность текста и иконок
  • Размер кликабельной зоны
  • Обратная связь при долгих операциях

Короткая шпаргалка по коду (исправления и советы)

  • Объявляйте currentLocation корректно: “string currentLocation = \”\”;”
  • При извлечении имени файла используйте Path.GetFileName(path) вместо ручных вычислений индекса.

Пример компактного и более надёжного создания кнопок:

var entries = Directory.GetDirectories(filePath).Concat(Directory.GetFiles(filePath));
foreach (var entry in entries)
{
    var attributes = File.GetAttributes(entry);
    if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue;

    var fileName = Path.GetFileName(entry);
    Button newButton = new Button();
    newButton.Text = fileName;
    newButton.Name = entry;
    newButton.AutoSize = false;
    newButton.Width = panel_FilesList.ClientSize.Width - 20;
    newButton.Height = 40;
    newButton.TextAlign = ContentAlignment.MiddleLeft;
    newButton.Padding = new Padding(8, 0, 0, 0);
    newButton.Click += button_Click_Open;
    panel_FilesList.Controls.Add(newButton);
}

Этот вариант использует Path.GetFileName, автоматически подстраивает ширину и даёт более компактный внешний вид.

Критерии приёмки

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

Вопросы безопасности и приватности

  • Приложение не должно отправлять данные о локальных файлах на внешние сервисы.
  • Предоставляйте пользователю предупреждение перед операциями удаления.
  • При доступе к защищённым директориям обработайте UnauthorizedAccessException и сообщите пользователю о недостатке прав.

Краткий глоссарий

  • FlowLayoutPanel — контейнер Windows Forms для автоматического размещения контролов в потоке.
  • Environment.SpecialFolder — перечисление системных специальных папок в .NET.
  • Path.GetFileName — безопасный способ получить имя файла из пути.

Итог

Файловый менеджер — отличная учебная задача для освоения Windows Forms: она охватывает работу с UI, манипуляцию файлами, обработку исключений и UX-детали. После реализации базовой версии подумайте о производительности, локализации и улучшениях интерфейса.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как исправить неработающие Быстрые параметры в Windows 11
Windows

Как исправить неработающие Быстрые параметры в Windows 11

Точка доступа Windows 11 не работает — как исправить
Windows

Точка доступа Windows 11 не работает — как исправить

Event ID 2505: ошибка привязки транспорта в Windows 11
Windows

Event ID 2505: ошибка привязки транспорта в Windows 11

Ошибка 'Installation ended prematurely' в Windows — как исправить
Windows

Ошибка 'Installation ended prematurely' в Windows — как исправить

Отключить удалённый Mobile Hotspot в Windows
Windows

Отключить удалённый Mobile Hotspot в Windows

Исправление уведомления «Проверить диск на наличие ошибок»
Windows

Исправление уведомления «Проверить диск на наличие ошибок»