Синхронизировать файлы клиентов с сервером - Electron/node.js
Моя цель - создать приложение Electron, которое синхронизирует папку клиента с сервером. Чтобы объяснить это более четко:
- Если у клиента нет файлов на хост-сервере, приложение загружает все файлы с сервера на клиент.
- Если у клиента есть файлы, но некоторые файлы были обновлены на сервере, приложение удаляет ТОЛЬКО устаревшие файлы (оставляя неизмененные) и загружает обновленные файлы.
- Если файл был удален с хост-сервера, но присутствует в папке клиента, приложение удалит файл.
Просто приложение должно убедиться, что у клиента есть ТОЧНАЯ копия папки хост-сервера.
До сих пор я делал это через wget -m, однако часто wget не распознавал, что некоторые файлы изменились, и у клиентов остались устаревшие файлы.
Недавно я слышал о zsync-windows и пакете webtorrent npm, но я не уверен, какой подход правильный и как на самом деле достичь моей цели. Спасибо за любую помощь.
0 ответов
Rsync - хороший подход, но вам нужно будет получить к нему доступ через node.js
Такой пакет npm может вам помочь: https://github.com/mattijs/node-rsync
Но в системах Windows все будет немного сложнее: как получить команду rsync в Windows?
Вы можете использовать rsync
который широко используется для резервного копирования и зеркалирования, а также в качестве улучшенной команды копирования для повседневного использования. Он предлагает большое количество опций, которые контролируют каждый аспект его поведения и позволяют очень гибко определять набор копируемых файлов.
Он известен своим алгоритмом дельта-передачи, который уменьшает объем данных, отправляемых по сети, отправляя только различия между исходными файлами и существующими файлами в месте назначения.
Для вашего варианта использования:
- Если у клиента нет файлов на хост-сервере, приложение загружает все файлы с сервера на клиент. Этого можно добиться с помощью простого rsync.
Если у клиента есть файлы, но некоторые файлы были обновлены на сервере, приложение удаляет ТОЛЬКО устаревшие файлы (оставляя неизмененные) и загружает обновленные файлы. Используйте: –remove-source-files или -delete в зависимости от того, хотите ли вы удалить устаревшие файлы из источника или из места назначения.
Если файл был удален с хост-сервера, но присутствует в папке клиента, приложение удаляет файл. Используйте: -delete параметр rsync.
rsync -a - удалить исходное назначение
Учитывая, что это список папок (и, следовательно, с простыми именами файлов без пробелов и т.д.), вы можете выбрать имена файлов с помощью кода ниже
# Get last item from each line of FILELIST
awk '{print $NF}' FILELIST | sort >weblist
# Generate a list of your files
find -type f -print | sort >mylist
# Compare results
comm -23 mylist weblist >diffs
# Remove old files
xargs -r echo rm -fv <diffs
вам нужно удалить последний echo
позволять rm
Работа
В следующий раз, когда вы захотите обновить зеркало, вы можете изменить comm
строку (поменяв местами два аргумента файла), чтобы найти набор файлов, которых у вас нет, и передать их в wget
.
или
rsync -av --delete https://mirror.abcd.org/xyz/xyz-folder/ my-client-xyz-directory/