Однажды HR предложили мне в качестве тестового задания сделать проводник на вебе. Примерное описание ТЗ содержится в заголовке. Задание меня заинтересовало. Непродолжительный поиск в гугле ничего похожего не дал. Тем интереснее. Для работы с файлами нам достаточно стандартных классов: (System.IO) DriveInfo- Предоставляет информацию о дисках. Так мы узнаем какие диски подключены, их имена, емкость и свободное пространство (System.IO) DirectoryInfo — Предоставляет информацию о папках. получение информации о вложенных папках и файлах (System.IO) FileInfo — Предоставляет информацию о файлах. получение размера Первое, с чего предлагаю начать – создадим модельку которая смотрит подключенные диски, чтобы смотреть по каким путям нам вообще ходить, показать какие диски есть и отобразить их размеры: Для этого в папке Models создал папку FilesModels и в ней DisksModel.cs и вставляем код: В конструкторе мы получаем информацию по имеющимся дискам, выбираем только готовые к работе и не берем флэшки. Также дополнительно, чтобы возвращать размерность в нужных единицах измерения заодно вставил статичный класс. Создаем контролер для работы с файлами в папке FilesControllers создаем FilesController.cs. Указываем какую страницу открывать и в нем же статично получаем информацию о дисках для дальнейшего использования. Далее в папке Views создаем папку FilesViews и страницу Files.cshtml. И создаём там таблицы, в которых будут отображаться информация о дисках на компьютере заодно в прогресс баре указывается сколько места заполнено. И как раз используется информация из статического класса в контроллере и переводим в гигабайты за счет ранее написанных методов. Добавим скрипт украшательства ради для сворачивания/разворачивания дисков в/из общего объема, а onclick=»getFolder(null,’@(driveInfo.Name+»\» встретится чуть позже. Прописываем еще одну кнопку в _Layout.cshtml Получим: Теперь необходимо отобразить размеры файлов и папок. В этом есть проблема, т.к. в DirectoryInfo нет информации о размере, и, как я понял, тот же проводник windows просто каждый раз считает размеры файлов в папке, дальше идет по вложенным папкам и потом возвращает конечную сумму файлов (например, когда вы нажимаете свойство папки, какое-то время идет подсчет размера на ваших глазах и время подсчета зависит в первую очередь от количества файлов внутри). Так же поступим и мы. Понадобится модель для хранения информации. Предлагаю такую: Мы получили массив файлов в папке с их размерами, рекурсивно ходим по вложенным папкам возвращая их размер (т.е. размер файлов в них), и конечную сумму размеров. Дополнительные функции, одна из которых понадобится для получения нашей модели по указанному пути: Здесь стоит трай катч. Это был быстрый способ для обхода ошибок связанных с чтением системных закрытых файлов и папок. Теперь вопрос: как это представить и что выводить на экран. Проводник windows обычно выводит имя, дату изменения, тип и размер файлов, значит и мы выведем такое. Первое, что пришло в голову — написать отдельную модель. В этой модели мы как раз реализуем все то что хотим увидеть. Ну и заодно сразу добавим методы в статичном классе. Мы реализуем перевод в json для передачи на страницу и несколько методов перевода из предыдущей модели в нашу новую. Также в одном из методов реализована сортировка. Надо придумать представление. Самым простым будет использование все той же таблицы. Сначала в наше ранее используемое представление (в то, где мы рисовали диски) записываем: Указываем, какую используем модель и дополнительно пространство. Теперь сделаем саму таблицу. При открытии страницы сначала показываем содержимое первого диска из списка. Также делаем кнопки назад и вперед, место, где указываем путь. Также функции: Соответственно возврат назад: Получение представления по указанному пути — как раз та функция, которая встречалась еще в отображении дисков на странице. Записываем в таблицу полученную модель. И функция для нажатия на строку в таблице. Если папка, то пытается пройти дальше, а на файл просто отвечает, что не может его открыть. Добавляем совсем короткий скрипт для сортировки, который по сути так же делает запрос на получение страницы и заодно передает по какому полю сортировать. Вспомним про метод, возвращающей модель для представления с сортировкой. Он определяет, по какому полю сортировать. Соответственно где-то надо хранить для пользователей их значения. Самым очевидным способом является сессия. Поэтому в startup.cs добавляем services.AddMvc() и app.UseSession(), выглядит примерно так: Осталось реализовать в контролере как будем возвращать страницы. В fileController добавляем: Сам код: Если запрос приходит с указанием сортировки, то пишем в сессию по какому полю, а если такое поле уже указанно, то меняем порядок и отправляем модель. Надеюсь, кому-то пригодится данный материал, также каждый желающий может аргументированно провести автора лицом по коду. → Весь проект лежит тут github Спасибо за внимание. Автор статьи: @Sith_Lord Профессиональное сообщество