Как синхронизировать папки по интернету?

frizz_
Дата: 05.06.2019 13:13:44
Делаю программку для синхронизации файлов по сети наподобие майл облака.
С синхронизацией файлов справился:
Программка работает следующим образом:1 сервер и несколько клиентов. Соединение по indy tcp.
1.Сначала у клиента получаем список файлов и заносим его в sqlite базу. Причем заодно сравниваем с существующим списком файлов в бд: если не совпадает размер или дата изменения файла - ставим отметку(в бд), что файл изменен и его нужно отправить на сервер, если файл есть в бд, но нет в каталоге - удаляем из базы+ ставим отметку на удаление файла из сервера.
2. Соединяемся с сервером, получаем список файлов, сравниваем со списком бд, при этом производим необходимые действия - обновляем, либо удаляем файлы либо на сервере, либо у клиента.

Проблема в синхронизации самих каталогов: допустим у клиента есть пустой каталог "Новая папка", 1 этап- вносим папку в бд.
2. синхронизируемся с сервером -> теперь серверная часть создает папку "Новая папка" у себя. Тут вроде все логично.
3. например я удаляю данную папку у клиента и создаю заново с тем же названием. (Получилось так что вроде папка та же, но экземпляр уже другой).
По логике - на сервере старая "Новая папка" должна обновиться. Но как у клиента унифицировать папку - непонятно.
Если б у каждой папки был свой id или guid - проблем бы не было - клиент сканирует свой каталог, видит в нем "Новую папку" - сравнивает id - если не совпадает - ставит отметку, что папка обновлена и ее нужно обновить и на сервере.
goldmi45
Дата: 05.06.2019 13:25:55
frizz_,

чем же папка отличается от файла? Почему к папке отдельный подход? Если удалить у клиента файл, а потом создать с таким же именем, то файл будет таким же или другим?
DarkMaster
Дата: 05.06.2019 13:26:41
frizz_,

У папок/файлов - есть время создания.
Dimonka
Дата: 05.06.2019 13:27:59
Тут непонятна цель всего задуманного. Сначала определись с целями, терминологией, а потом уже берись за планирование и реализацию.

Например для файловой системы клиента глубоко фиолетово была ли папка удалена и создана заново или нет. Это всё равно одна и та же папка.

Сложнее если папка была переименована, тогда (по идее) не надо повторно загружать на сервер уже сохранённые файлы. С другой стороны если файлы небольшие - пофиг - синхронизируй всё. Если файлы большие, то можно подумать о хешировании файлов и проверки наличия их на сервере без загрузки.

В папку как вариант при первой синхронизации можно сохранять идентификатор папки и просить пользователей не баловаться с этими идентификаторами. В общем успехов в создании своего GIT-a. :-)
Dimitry Sibiryakov
Дата: 05.06.2019 13:29:38

frizz_
Если б у каждой папки был свой id или guid - проблем бы не было

У тебя удачный день, у них таки есть id.
http://delphi.cjcsoft.net/viewthread.php?tid=46358

Posted via ActualForum NNTP Server 1.5

frizz_
Дата: 05.06.2019 14:57:06
goldmi45
frizz_,

чем же папка отличается от файла? Почему к папке отдельный подход? Если удалить у клиента файл, а потом создать с таким же именем, то файл будет таким же или другим?


1. Отличается тем, что в файле есть некое содержимое и оно может отличаться, то есть файл 1.txt= 12kb, а новый 1.txt=13kb, а старую "новая папку" я не могу отличить по размеру от новой "новой папки".
2. Отличается тем, что -> у клиента время изменения файла 01:01:01. В какой то момент программа отправляет файл серверу (когда появился интернет например). на сервере -дата изменения файла будет дата его получения: например 02:02:02. Хорошо, вместе с файлом отправляем и время его изменения на клиенте, получится что сервер получил в 02:02:02, но принудительно изменил атрибуты на 01:01:01. Это работает с файлами, но не с папками, допустим я поменял атрибут папки: выставил ему время изменения как у клиента но!- если в папку положить файл - изменится дата изменения папки, хотя саму папку я вроде как не менял (хотя на самом деле - копируя файл в папку - мы всего лишь добавляем запись в папку, то есть папка это тоже файл), как итог - при следующей синхронизации клиент видит что время изменения папки на сервере изменилось, значит его обновил другой клиент! надо закачать, хотя инициатор он сам же. Проблема в том, что сложно отслеживать время изменения каждой папки, в которых меняются файлы. Ищу идею, как бы обойтись без привязки синхронизации по времени(для папок), то есть однозначно синхронизировать папки ежду сервером и клиентом, игнорируя атрибуты времени. Программа как то должна понимать...блин, я запутался.
frizz_
Дата: 05.06.2019 15:12:29
Dimonka
Например для файловой системы клиента глубоко фиолетово была ли папка удалена и создана заново или нет. Это всё равно одна и та же папка.


Не совсем:
1. Создаем папку у клиента
2. Вносим запись в бд + пометку, что ее нужно синхронизировать.
3 Синхронизируем, ставим отметку, что папка есть на сервере.
4. Удаляем папку у клиента(синхронизации еще нет)
5. На клиенте2 обновляем папку, синхронизируем, теперь на сервере это уже другая папка.
6. клиент1 подключается к сети - папка помечена на удаление, но на сервере уже не та папка.
Dimonka
Сложнее если папка была переименована, тогда (по идее) не надо повторно загружать на сервер уже сохранённые файлы. С другой стороны если файлы небольшие - пофиг - синхронизируй всё. Если файлы большие, то можно подумать о хешировании файлов и проверки наличия их на сервере без загрузки.
Для этого сделал "теневую папку", куда перемещаются все, что удалено и переименовано. Файлы синхронизируются заново. Пока лучше ничего не придумал.
Dimonka
В папку как вариант при первой синхронизации можно сохранять идентификатор папки и просить пользователей не баловаться с этими идентификаторами. В общем успехов в создании своего GIT-a. :-)
там папки со множественными вложениями и подпапками, да и вообще - влезать со своими файлами в чужие файловые структуры - нехорошо.
Мимопроходящий
Дата: 05.06.2019 15:14:55

зачем все эти лисапеды?
или это курсач?

Posted via ActualForum NNTP Server 1.5

frizz_
Дата: 05.06.2019 15:17:05
Dimitry Sibiryakov
frizz_
Если б у каждой папки был свой id или guid - проблем бы не было

У тебя удачный день, у них таки есть id.
http://delphi.cjcsoft.net/viewthread.php?tid=46358

Спасибо мил человек, пока на ум приходит только одно - если эта функция работает - разместить его на сервере - клиент синхронизируется, новая папка создается на сервере, тут же получает этот id и отправляет его клиенту. Клиент прописывает его в в своей базе, в записи "Новая папка"... дальше пока не сообразил.
frizz_
Дата: 05.06.2019 15:21:28
Мимопроходящий
зачем все эти лисапеды?
или это курсач?
битторентсюнч - скорость низкая, майл облако - ограничение
в размере передаваемого файла+ ограничение совокупного объема
нормальных бесплатных синхронизаторов не нашел, да и не подходят они мне.