Pull to refresh

Создаем свою файловую систему в ОС Windows на .Net

Reading time 3 min
Views 19K
Существует великое множество файловых систем. Это и файловые системы для носителей информации (FAT*, NTFS, ext* и т.д.), и сетевые файловые системы (NFS, CIFS и т.д.), и виртуальные файловые системы, и великое множество других. А появлялась ли у тебя, %habrauser%, потребность в своей, еще несуществующей файловой системе? О том, как ее сделать для ОС Windows на managed-коде (.net), и пойдет речь.

В общем случае, для создания своей файловой системы (далее ФС), необходимо написать драйвер этой ФС и зарегистрировать его в ОС. Т.к. драйвер взаимодействует с ядром ОС, то его создание на managed-коде является делом нетривиальным, а производительность такого драйвера будет на невысоком уровне. В связи с этим, целесообразнее иметь драйвер ФС, написанный на native-коде и некий промежуточный слой между этим драйвером и managed-кодом. Такой драйвер существует в проекте Dokan, равно как и набор классов DokanNet для взаимодействия с этим драйвером в managed-коде. Оба проекта распространяются под лицензией GPLv3.

Попробуем разобраться, как это работает



Dokan — это драйвер, работающий на уровне ядра Windows, с которым могут взаимодействовать любые приложения из userspace-а. Драйвер существует как для 32-ух разрядный систем, так и для 64-ех разрядных. Драйвер не несет в себе реализацию какой-либо ФС, а лишь выступает в роли прокси, пропуская через себя все операции ввода-вывода (IO) из ядра ОС в userspace. Реализация функционала ФС лежит на наших плечах, мы создаем базовые функции ФС, такие как открытие/закрытие файла, чтение из файла, запись в файл и т.д., которые будут вызываться драйвером Dokan при возникновении в системе соответствующих событий. В момент регистрации нашей ФС в драйвере Dokan, мы указываем некоторые параметры работы нашей ФС (кол-во потоков-обработчиков операций ввода/вывода, точка монтирования нашей ФС (Dokan поддерживает монтирование в качестве съемного или сетевого диска и только в корень ФС), автоматическое размонтирование нашей ФС, в случае ошибок в работе, и некоторые другие параметры). После этого в ОС появляется новый диск в корне ФС, с которым любые приложения и сама ОС взаимодействует, как и с обычным диском. Какие операции разрешено производить в данной ФС, зависит только от разработчика этой ФС, то есть от нас.

DokanNet – это обертка над драйвером Dokan. Позволяет разрабатывать свою ФС на managed-коде. DokanNet описывает интерфейс DokanOperations, который необходимо реализовать для регистрации нашей ФС в драйвере Dokan. Автор DokanNet вместе с исходниками самого проекта положил 2 примера работы с данной оберткой:
  • DokanNetMirror — ФС-зеркало уже существующего каталога
  • RegistoryFS — ФС, представляющая структуру системного реестра Windows в директории и файлы

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

Реализация интерфейса DokanOperations сводится к реализации следующих функций:
  • CreateFile — создание файлов/директорий
  • OpenDirectory — открытие директории
  • CreateDirectory — создание директории
  • Cleanup — удаление файла/пустой директории
  • CloseFile — закрытие файлового дескриптора
  • ReadFile — чтение куска файла указанной длины с указанным смещением
  • WriteFile — запись данных в файл с указанным смещением
  • FlushFileBuffers — очистка буферов (кэша) файла
  • GetFileInformation — получение информации о размере, атрибутах, времени создания/последнего доступа/модификации файла/директории
  • FindFiles — получение списка файлов/директорий в указанной директории
  • SetFileAttributes — установка атрибутов файла/директории
  • SetFileTime — установка времени создания/последнего доступа/модификации файла/директории
  • DeleteFile — пометка файла на удаление (удаление проводится в Cleanup)
  • DeleteDirectory — пометка директории на удаление (удаление проводится в Cleanup)
  • MoveFile — перемещение/переименование файла/директории
  • SetEndOfFile — установка размера файла (используется при создании пустого файла определенной длины)
  • SetAllocationSize — автор не указал для чего необходима данная фун-ция, на практике передача управления в нее не замечена
  • LockFile — блокировка файла в single-доступе
  • UnlockFile — снятие блокировки
  • GetDiskFreeSpace — получение информации о кол-ве доступного/общего/свободного места в ФС
  • Unmount — размонтирование/отключение ФС


Как мы видим, функционал, предоставляемый драйвером Dokan и оберткой DokanNet очень богат. На базе данного проекта разработана ФС SSHFS. Каждый может разработать ФС, отвечающий своим требованиям. Я же остановился на разработке HttpFS, которая позволит монтировать в систему файлы, находящиеся на удаленных Http-серверах. Но об этом в следующей статье…
Tags:
Hubs:
+40
Comments 60
Comments Comments 60

Articles