Разработка "Файловых систем" для Linux, Mac, Windows
Какие технологии используют такие приложения, как dropbox (http://www.dropbox.com/) и expandrive (http://www.expandrive.com/mac) для создания функциональности прямо в локальных файловых системах на каждой платформе? Может ли кто-нибудь предложить что-нибудь, что позволит максимально использовать повторное использование кода на всех основных платформах?
Я только изучал FUSE на Linux, и мне нравится то, что я вижу.
Ответы
Ответ 1
Реализация виртуальной файловой системы очень специфична для ОС. Причина в том, что архитектура драйверов отличается в Unix-подобной ОС и в Windows.
Чтобы не писать собственный драйвер, вы можете использовать инструментарий файловой системы пользовательского режима. В Linux, BSD и MacOS существуют FUSE и OSXFUSE (fork неактивного MacFUSE) соответственно. В Windows используется Система обратного вызова.
В настоящий момент Dropbox не имеет виртуальной файловой системы, а только расширение оболочки (afaik они планировали создать виртуальный диск, но я не знаю, что они решили).
Относительно того, как отслеживаются изменения файлов: существует несколько методов. Простейшим является сканирование каталога по таймеру и сравнение временных меток и размеров файлов. Затем можно использовать функцию FindFirstChangeNotification WinAPI. И самым сложным и надежным методом является использование драйвера фильтра файловой системы. В Windows можно использовать CallbackFilter. В MacOS X и Linux вы можете получать сообщения, похожие на то, что предлагает FileSystemWatcher в .NET/Windows. В частности, в Linux можно использовать inotify.
Ответ 2
То, что вам нужно, это файловые системы usrspace. Я не знаю, существует ли унифицированное решение для реализации файловых систем на всех (или более всех) платформах (возможно, нет), но здесь исходная точка:
Я не знаком со всеми из них, поэтому я не знаю, насколько легко прокси-серверы/интерфейсы, чтобы вы могли без проблем реализовывать файловые системы независимо от платформы. Во всяком случае, операции, которые должна поддерживать файловая система, (в некоторой степени) одинаковы для всех (открывать, читать, писать и т.д.), Поэтому на первый взгляд это кажется простым началом (даже если кодируется с помощью методов предварительной обработки С, Тем не менее, вы можете взглянуть на библиотеки С++ boost, которые должны быть независимыми от платформы и предложить некоторые хорошие инструменты для независимой разработки платформы, такие как а).
Удачи!
Ответ 3
Я встречаюсь с подобными проблемами, такими как ваши: разработка "кросс-платформенных" файловых систем.
- Если вы собираетесь разработать собственную файловую систему, лучше всего попытаться выделить столько же, сколько ваши алгоритмы файловой системы (вычисление дискового макета, контрольных сумм, структур данных каталога и т.д.), помимо os- конкретных API, в ansi-c. Вы можете прочитать код ZFS, который считается хорошо написанным, так что его можно легко переносить в FreeBSD/Mac/Linux.
- В противном случае, если вы можете удовлетворить затраты на производительность файловых систем с файлами пользователей, поддерживать файловую систему через Mac/Linux/BSD тривиально. Используя POSIX API, FUSE и сторонние библиотеки, доступные на каждой платформе, это то, что я делаю сейчас. Однако для окон я слышал реализацию FUSE, но я не думаю, что это готово к производству. Таким образом, как и в случае разработки собственной файловой системы, попробуйте как можно больше инкапсулировать логику файловой системы в ansi-c.
Ответ 4
довольно легко в Windows прослушать изменения файлов:
http://msdn.microsoft.com/en-us/library/atwhk15d(v=vs.80).aspx
Ответ 5
Это пример реализации Mac OS FUSE:
http://www.macupdate.com/app/mac/23729/macfuse