Простой клиент OneDrive — всё не так просто

в 13:28, , рубрики: microsoft, Блог компании SyncDriver, Облачные вычисления, облачные хранилища, синхронизация файлов

Всем давно уже известен сервис OneDrive от Microsoft, который представляет собой облачное хранилище данных с неплохим Web UI.

Для аналогичных сервисов, в частности, Dropbox, выпущено огромное количество дополнений и расширений, например, MacDropAny и многие другие. Для OneDrive не так много расширений, поэтому он стал площадкой для нас — и мы выпустили альтернативный клиент для OneDrive — syncDriver.

Простой клиент OneDrive — всё не так просто

У него есть вся функциональность стандартного клиента от Microsoft, а кроме того ряд особенностей, ради которых его имеет смысл использовать. Установить его можно здесь. Сразу после установки он предложит вам осуществить подключение к сервису OneDrive.

Настройка

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

Всё, он работает...

После настройки понадобится некоторое время на скачку метаданных OneDrive и анализ локальной файловой системы.
Если аккаунт содержит большой объем данных, скачивание всего занимает некоторое время. Чтобы оптимизировать этот процесс, можно настроить выборочную синхронизацию.
Когда синхронизация закончена, любые изменения в папке будут отражены в аккаунт OneDrive.

Что умеет

Если есть необходимость добавить в OneDrive произвольную папку с вашего компьютера, syncDriver позволяет использовать симлинки — это реализовано командой Link a folder (или кнопка Add на основной форме).

В syncDriver возможна выборочная синхронизация.
Команда Selective Sync… в окне настроек позволит добавить/исключить папку из синхронизации: все изменения, производимые в ней после этого, не будут отправлены в OneDrive.

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

Простой способ доступа к OneDrive — это назначить букву устройства для папки синхронизации.

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

Работает на всех известных нам версиях Windows начиная от XP до 8.1, на Windows 10 ещё будем тестировать.

Как сделан

Чтобы поддерживать клиент под разные ОС было принято решение использовать .NET. Специфичные для разных систем фрагменты (в основном UI и работа с сервисами/демонами) выделены в отдельные сборки. Текущая версия содержит UI на Windows forms, для версий для других платформ используется Gtk# — но эта версия ещё не выпущена в production.
Для логгирования в системе мы выбрали NLog — работает быстро и конфигурируется крайне просто.
Для модульной SOA мы реализовали свой Framework Context.NET, который доступен на github.

Как работает

syncDriver состоит из двух частей: сервиса и клиента (UI). Общаются они посредством json-пакетов, пересылаемых через сетевое соединение.
Кроме того, все настройки сервиса описаны в .config файле, который настраивается из UI клиента.
Синхронизация в клиенте устроена таким образом, чтобы обеспечить изоляцию локальной файловой системы от файловой системы в облаке. Каждая из файловых систем реализована как некоторая абстракция, которая решает задачи мониторинга, индексации и применения изменений независимо. Это означает что уровень OneDrive ничего не знает про локальную файловую систему и наоборот.

Весь процесс синхронизации проходит по следующему сценарию:
— каждая файловая система проводит полную индексацию ресурса и сохраняет в локальную базу
— файловая система отвечает за обнаружение изменений и направление сообщения в очередь
— сообщения в очереди обрабатываются в строгом порядке, за исключением особых случаев, которые мы рассмотрим позже
— в случае ошибки мы дожидаемся завершения всех параллельно выполняющихся операций и выполняем её повторно. Если ошибка возникает снова, она записывается и выдаётся на UI.

Локальная файловая система мониторит изменения через FileSystemWatcher. Кроме того, происходит полный обход дерева с некоторым интервалом, это гарантирует нам подхват изменений, сделанных когда клиент не был запущен.

Получение дерева файловой системы OneDrive реализовано через несколько API, которые дают нам информацию о том, что изменилось при сопоставлении с локальной базой данных.

Ключевым аспектом синхронизации является тот факт, что в процессе синхронизации не сравниваются две файловые системы, а файловая система сравнивается с её предыдущей версией из базы данных, это и даёт нам возможность синхронизации в одну сторону.

Отдельным образом в очереди синхронизации обрабатываются переименования и перемещения. Если, например, мы создали папку с большим количеством файлов, а затем её переименовали, то переименование происходит в первую очередь, и все сообщения в очереди переименовываются соответственно, то есть мы загружаем файлы уже в переименованную или перемещенную папку.
В случае конфликтного изменения файла с двух сторон формируется дополнительная копия файла с суффиксом (1), (2) и т.д., автоматическое разрешение конфликтов может быть опцией для будущих версий.

Проблемы

Больше всего проблем было связано с обработкой событий от файловой системы:
— при копировании большого файла мы получаем большое количество событий, каждое из которых нужно перепроверить — закончился ли процесс копирования или нет.
— при сохранении файла ряд приложений создают временный файл, а затем переименовывают его в файл назначения.
— при попытке повернуть изображение непосредственно в Windows Explorer происходит ряд событий: создание нового временного файла, замещение предыдущего, удаление временного (от предыдущего пункта отличается тем, что временный файл не переименовывается, а копируется).

К настоящему моменту большинство проблем решено, и версия довольно стабильна с момента перехода на OneDrive со SkyDrive.

Зачем

Нашей целью было предложить вам лёгкую, стабильную версию клиента для известного сервиса от MS. Более того, мы планируем выпустить portable версию своего продукта.
Паралельно мы разрабатываем версию для Linux.
И всё-таки зачем?
Сейчас пользователи приходят при к нам для решения следующих задач (в порядке приоритета):
— Работа под Windows 8.1 с локальным accountом
— Работа под Windows XP
— Использование симлинков
— Использование сетевых дисков
— Работа через прокси с авторизацией
и ряд других возможностей.

A больше всего нам хотелось бы услышать в комментариях, какие фичи более всего интересны для вас.

Автор: Bendsen

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js