![]() |
Модераторы: 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% должен содержать полный путь к файлу, его размер, и еще что-то, но никак не пойму.Вы говорили на счет хеширования, а как его применить-почитал статьи в интернете- ничего не понял. И как можно не применяя стандартных функций, определить для конкретной папки директории для хранимых файлов в этой папке и других подпапках Друзья, подскажите пожалуйста по этим вопросам |
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
еще ответь на вопрос, что делать когда один файл изменяется одновременно на (попростому) двух компьютерах?
|
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
/me вспоминает ужасы пятничного merge-а...
простого SVN\perforce\mercurial\etc. недосточно чтоли? -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Remiznik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 30.4.2005 Репутация: нет Всего: 1 |
а что если просто хранить время последнего изменения ? если на какойто машине время больше то эту версию нужна перекинуть на другую ... ну это для не больших машин !
вы ведь будете дома пользаватся а время на компах одинаковое )) |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
seravr, а ты не пробовал что-нибудь вроде сетевого диска ?
|
|||
|
||||
seravr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
елки-палки, да конечно можно найти такие программы, говорю же, хочу сам написать. А по поводу хранения времени изминения, это хорошо Друзья, а можно написать батник, который бы выводил скажем в лог-файл директории всех файлов и файлов подпапок, информацию о размере и последнем изминении файла??? Добавлено через 1 минуту и 16 секунд
Да, вот с этим то как раз проблема |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
это не будет работать, так-как время на 2х компьютерах может быть разным Добавлено через 2 минуты и 59 секунд
самый веслелый merge бывает в понедельник... в принципе можно скрипт написать, который будет использовать git, mercurial или bazaar для управления изменениями |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
||||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Ребята, а сложно написать батник, который бы выводил скажем в лог-файл директории всех файлов и файлов подпапок, информацию о размере и последнем изминении файла???
Чего посоветуете почитать??? |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
алгоритм по сравнению файлов с информацией о всех файлах не подходит(так можно сделать только на начальной стадии)-уходит много времени и мне кажется, так не делают.Скажем, написал простенький класс, который в файл пишет по заданной директории всю информацию о хранимых там файлах(вообщем, в файл вывожу _finddata_t для каждого файла). Получается, например, для моего диска d:\ этот файл весит порядка 20 метров, и этот файл придется передать серверу, который будет сравнивать инфу о файлах, кот. пришла от клиента, и искать что нового там(на клиентском узле) произошло, и делать соответствующие решения- на это потратиться очень много времени. Вообщем, я в тупике, посоветуйте что можно сделать, очень Вас прошу
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Все варианты вижу глючными и сложными. Простейший пример: На двух компах одна и таже табличка с домашними финансами. Муж правит на своей машине доходы, а жена расходы. Оба сохраняются. Чей вариант победит? Вариант1: Быстро и радикально. Ставить в квартиру третий комп, расшаривать на нем диск и работать только по сетке. ![]() Вариант2: Поставить серверную СУБД и все файлы держать в ней. Доступаться только с помощью своих клиентских приложений. ![]() |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
На одном компе подключить жёсткий, открыть ftp, на втором подключить жётский, открыть ftp, залить файлы на оба жёстких.
Первым скачать новые, зарегистрировать их у себя в файле, вторым скачать новые, которых нет в списке последних регистрированных на первом, зарегистрировать их у себя в файле. Отсутствие регистрационного файла == регистрационный файл пуст. Это сообщение отредактировал(а) inside_pointer - 3.3.2009, 00:20 |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Lazin, как Вы считаете, какой алгоритм хеширования подойдет? И как можно узнать что какой - либо файл изменился? Добавлено через 6 минут и 43 секунды Вообще, мне лучше упростить и сделать вот как: пусть мой комп будет типа главным, а на другой я буду просто зеркалировать файлы, т.е. на другом компе другие люди просто могут иметь доступ и просматривать содержимое каталога. Тогда наверное, попроше будет |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Просто расшарьте диск и общие файлы пусть с вашего компа берут. На самом деле задача не такая уж и безумная - когда мне по работе нужно было таскать проект с работы домой и обратно у меня была мысль написать такой синхронизатор, стандартный виндовский кейс мне не понравился. Но поразмыслив денек над сложностью я отказался - задача решаема, но не в 5 минут. А в ситуации синхронизации файлов в домашней сетке - тут необходимы организационные методы: 1. Количество файлов, которые реально необходимо зеркалить на практике не превышет нескольких штук. Лично у меня - это 2 файла - мультимедиа каталог и записная книжка. С обоими я поступил методом хранения на одном компе. В ситуации, когда необходимо поработать на своем компе при выключенном первом - дейтсвую методом переноса через флешку, причем именно переноса, а не копирования. Поработал - вернул на место. Синхронизировать копии - дело чреватое глюками и ошибками. ИМХО. |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
В случае исходных кодов очень подойдет децентрализованная система контроля версий, обычно я в таких случаях и использую git или mercurial а в остальных действительно необходиомсти и необходимости поиска другого решения окромя контроля версий не возникало. опять же имхо. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Я подумал, и решил, что в случае, когда изменяются 2 одинаковых файла, делать общую копию по последнему изминению( и не важно кто и что там наисправлял)
Друзья, кто нибудь может помочь разобраться с хешированием и diff? |
|||
|
||||
ir4y |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 3.6.2008 Репутация: нет Всего: нет |
(оффтоп)
Я конечно понимаю желание разобраться с программированием и стать реально крутым меном у seravr'а но пытаться воротить какие то адские программы типа сетевой синхронизации винтов это полный бред(извиняюсь за жесткость высказывания) raid0, а тут именно что то подобное человек сделать пытается, по сети в 100Мб не синхронизуешь нормально.... если конечно у него не 10Гб оптика между компами проложена..... практически половина сообщений в теме полный оффтоп, в связи с некомпитентностью топикстартера =( (не оффтоп) при таком подходе
в файле будет каша так как пользователь не знает как на самом деле выглядит файл. например первый пользователь изменил строку а второй ее просто удалил информация первого пользователя потерена .... придется блокировать доступ к файлу во время его редактирования другим пользователем, из-за чего последует необходимость синхронизации ввода вывода.... по поводу diff качаешь http://gnuwin32.sourceforge.net/packages/diffutils.htm устанавливаешь в программе своей exec'аешь diff через api или перенаправление в файл получаешь вывод программы.... если хочешь оптимизировать качаешь исходники и вкручиваешь необходимые функции в свой код аналогично с хэшированием для примера можешь взять md5 но он тяжеловесный лучше что-нибудь по проще .... находишь исходники либо по rfc пишешь сам и считаешь хэш сумму файла если совпала со старой файл не менялся если изменилось то запускашь diff и определяешь что именно и как .... Это сообщение отредактировал(а) ir4y - 3.3.2009, 10:39 |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
ir4y, спасибо Огромное, пойду разбираться
|
|||
|
||||
Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 2 Всего: 22 |
http://ru.wikipedia.org/wiki/Rsync Open source: http://samba.anu.edu.au/ftp/unpacked/rsync/ http://samba.anu.edu.au/ftp/rsync/ |
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Vaulter, спасибо!!!
ir4y, спасибо, разобрался с md5 Как Вы думаете, вот "просканировал" я каталог, который хочу "зеркалировать", для каждого файла получил хеш, но ведь этим только я смогу отслеживать изминения внутренней как бы структуры файла, но ведь этого недостаточно, в принципе можно для каждого файла записывать структуру _finddata_t, но размер этой структуры 296 байт(хотя странно, если посмотреть в io.h, то там взглянуть на структуру _findata_t, то на самом деле объет этого типа должен занимать 292 байта, почему у меня sizeof(обект типа _findata_t) занимает 296 байт, вообщем странно, может "дыры" сказываются или указатель там еще есть, вообщем-непонятно ), т.е. вообщем, для любого файла(причем, не важно какой это файл, я имею ввиду размер, то ли он будет равен 1 байту или 100 мб- для каждого из них информация будет весить = sizeof(_findata_t) +хеш ) . Вобщем, как Вы думаете, что оптимально хранить в информации о конкретном файле, как Вы считаете? вот пример из описания структуры _findata_t(у меня 32 разрядная система, и вижал студия применяет именно вот эту структуру)
|
|||
|
||||
seravr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 3.1.2009 Репутация: нет Всего: нет |
Друзья, выскажитесь пожалуйста кто как думает по поводу вышесказанного мною
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |