![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Приветствую Всех участников форума!
Я не профессиональный программист, скажем, любитель(по профессии-я не айтишник). Пришла в голову такая идея. Дома есть два компьютера, я хочу написать программу, которая отслеживает изменение файлов(например, на диске D) на обоих компьютерах, для того, чтобы у обоих компьютеров какой-либо каталог(или целый диск, где не установлен Windows) был одинаков, т.е. чтобы, например, одновременно работать с одним и тем же,но на разных компьютерах. Идея заключается в том, чтобы написать программу, которая будет заниматься отслеживанием появления новых файлов, удаления каких-либо файлов, или изменением существующих файлов. И как только что-либо изменилось на одном компьютере, тут же делать изменения на другом(чтобы на обоих компьютерах было все одинаково). Пока в голову приходит следующий алгоритм: На компьютерах работает программа(со временем ее можно и в автозапуск), которая "слушает" некий диск или какой-нибудь корневой файл. эта программа(у каждого компьютера она своя) записывает, например, в файл статистику того, что там храниться(например, полный путь всех файлов и размер каждого файла) и с определенным интервалом обменивается статистикой с другим компьютером, у которого тоже своя статистика, и программа сравнивает эти статистики, как только что-либо изменилось, тут же происходит добавление/удаление/изменение каких-либо файлов, например, по TCP(кстати, обмен статистикой тоже происходит по этому же протоколу). Вот пока в принципе что придумал с алгоритмом. Надеюсь, суть Вам ясна. Писать хочу на C/C++. Дорогие друзья, как Вы считаете, оптимален ли вышесказанный алгоритм. Если кто может быть встречал что-либо подобное, пожалуйста выскажитесь. Как Вы считаюте, как вообще правильно это организовать что-либо подобное. Ввиду того, что каждая программа на каждом компьютере, по-сути, только и занимается сравнением файлов статистики(путь к файлу и его размер), то программы скорее всего очень долго будут работать. К тому же как правильно сравнивать файлы( по директории и по размеру- этого будет достаточно???) С каким оптимальным интервалом делать опрос??? Скажем, обменяться по TCP текстомым файлов статистики недолго и быстро, но возникает проблема, если скажем выяснилось, что на одном компьютере есть файл объемом 300 мегабайт, то разумно его передавать другому компьютеру по TCP??? Вообщем, пока все что я хотел сказать, надеюсь, Вам понятно что я хочу сделать. Ребята, выскажитесь пожалуйста кто как думает. Мнение каждого очень ценю. Заранее всем благодарен. Если кто хочет-присоединяйтесь-будем вместе писать(пишите в личку) |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
судя по теме про указатели, тебе еще рано ставить перед собой такие задачи
![]() к тому-же зачем изобретать велосипед, если можно использовать windows live mesh или dropbox Добавлено @ 11:04 нет, хранить нужно не только путь и размер, но и хэш, а так-же при каждом изменении файла, рассчитывать diff, по которому можно получить предыдущее состояние файла, так-же нужно передавать по сети не весь файл, а только изменившуюся часть Это сообщение отредактировал(а) Lazin - 27.2.2009, 11:05 |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
По поводу рано или нет мне браться за такую задачу-не согласен, лучше писать что-то одно и набираться опыту.
Lazin, не можете поподробнее пожалуйста рассказать что такое хэш и diff |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
seravr, я боюсь что если не уметь пользоваться google, и не найти самостоятельно что это такое, то браться за такой проект действительно рано и бессмысленно. Вот Вам по хешированию http://ru.wikipedia.org/wiki/%D0%A5%D0%B5%...%BD%D0%B8%D0%B5 и по diff http://ru.wikipedia.org/wiki/Diff Добавлено @ 12:14 Lazin, имхо для больших бинарных файлов diff можно и не использовать, как считаете? Если большой файл скажем больше сотни мб, то весьма мала вероятность того что он будет изменен, поэтому разумно хранить только хеш и при его изменении передавать возможно стоит полностью весь. Это сообщение отредактировал(а) cutwater - 27.2.2009, 12:14 |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Спасибо, дело не в том что не умею, просто на самом деле не знаю что искать, что это такое(я имею вышесказанное) |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Google те две ссылки что я дал, находит запросам хеш и diff, взятые из Это я к чему.... seravr, старайтесь больше полагаться на собственные силы, и будет Вам тогда польза. Это сообщение отредактировал(а) cutwater - 27.2.2009, 21:00 |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
cutwater, спасибо, ну а вообще, я в правильном направлении (в плане алгоритма), может как то это по-другому люди делают???
А хеши соответственно для каждого файла делать и придется наверное делать многопотоково |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
seravr,
эту задачу можно решить на winapi (ReadDirectoryChangesW), если на втором компьютере использовать расшаренный ресурс. Программа будет работать на первом компе и сливать по сети изменения на второй. на C# задача решается проще, ввиду наличия готового класса (DirectoryWatcher или как-то так) |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Lazin, что же мне писать, что не спрошу- у Вас все рано!?
Рано-не рано, может вообще ничего не писать!!! или делать задачки по типу лабораторок!!! Надо же с чего то начинать!!! Rififi, спасибо, пока пишу программу как знаю , будут вопросы, отпишусь |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Lazin, я вообще создал этот топик чтобы посоветоваться по поводу алгоритма, а что мне делать я и сам разберусь, если не хотите писать по теме, то не надо флудить
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я уже описал, что должен делать алгоритм, по сути твоя программа должна быть распределенной системой версионного контроля, я бы не взялся такое писать )) по другому не получится, например есть 2 компа, А и Б, и твоя программа контролирует только один файл, допустим я изменяю файл на компьютере А, как программа на компьютере А поймет, что файл изменился и его нужно синхронизировать, а как она поймет что нужно сделать, загрузить данные с компьютера Б, или наоборот изменить файл на компьютере Б? в принципе можно сделать это просто, достаточно мониторить деректорию и при изменении ее состояния отправлять данные на другой комп полностью, но что будет, если файл будет изменен до того, как программа будет запущена, либо если на 2х машинах системное время отличается? ![]() |
|||
|
||||
vinick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
В случае если оба компьютера равноправны - задача не имеет смысла. В этом случае оба диска очень быстро превратятся в кашу. Если же просто зеркалировать один диск на другой, то отслеживать изменения в реальном времени ИМХО не нужно, а может быть и опасно. Тут наиболее действенным методом является тупое копирование с заменой в моменты когда с зеркалируемым диском не происходит никаких операций. Ну а если очень хочется что-то написать. Можно посмотреть на внутреннее устройство rsync. там как раз и хэши используются и передача файлов по сети. |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Lazin, vinick спасибо огромное, не все так просто как мне казалось.
Сейчас думаю сделать так: писать программу сервер, он поочередно опрашивает свой компьютер(т.е. где запущен, соответственно, на этом же компе будет одна клиентская прога), и по сетке другой комп. Тобиш, получается 2 клиента. Сервер содержит файл, в котором есть информация о хранимых файлах в определенной директории и поочередно с некоторым интервалом запрашивает у клиентов такой же файл, который на каждом компьютере поддерживает соотв. программа-клиент и сравнивает хранимые директории файлов и информацию о них. Как только сервер определит, что файл, полученный от клиента, имеет какие то различия с тем файлом, который имеет сервер, сервер после некоторых определенных проверок добавляет инфу об изминениях в свой файл и запрашивает у этого клиента(у которого сервер нашел изминения ) этот/эти файлы и отправляет другому клиенту, который копирует принятый в файл в такую же директорию, Вообщем, так до бесконечности, сервер просто работает и сравнивает инфу на разных компах. Тут как бы возникает три варианта: 1)какой-либо файл был изменен: вот в этом случае наиболее подходит предложенный Вами вариант с кешированием, когда передается вна другой комп добавленная/ удаленная инфа из файла 2)на одном компе создали фай-в таком случае сервер отправляет тупо на другой комп копию данного файла 3)какой-либо файл удален-тогда сервер тупо отсылает "команду" другому компу удалить такой же файлть Как считаете, можно так сделать? И мучаюсь с такими вопросами сейчас: 1) какую достаточно серверу хранить информацию о каждом файле, т.е. вообщем, он 100% должен содержать полный путь к файлу, его размер, и еще что-то, но никак не пойму.Вы говорили на счет хеширования, а как его применить-почитал статьи в интернете- ничего не понял. И как можно не применяя стандартных функций, определить для конкретной папки директории для хранимых файлов в этой папке и других подпапках Друзья, подскажите пожалуйста по этим вопросам |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |