Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > отслеживать изменения файловых ресурсов


Автор: denix 20.3.2009, 20:02
Всем привет.
подскажите пожалуйста как с помощью стандартного С++  можно отслеживать изменения файловых ресурсов(например, есть корневая папка, мне нужно чтобы программа отслеживала изменения файловых ресурсов, т.е. появление новых файлов и папок, их удаления, изминения)


Автор: Vaulter 20.3.2009, 20:29
Исходники rsync:
http://samba.anu.edu.au/ftp/rsync/

Цитата

rsync — (англ. Remote Synchronization) это программа для UNIX-подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодировку данных при необходимости.


Там, скорее всего, ты найдешь ответы на все свои вопросы... и не много больше  smile 

Автор: Rififi 20.3.2009, 20:32
denix
Никак. C++ не поддерживает такие возможности.

Автор: denix 20.3.2009, 21:35
ясненько, но ведь же Windows или же проводник как то изминения отслеживает согласитесь

Автор: leneCaress 20.3.2009, 21:38
да - в стандартных библиотеках с++ такого нету...

если вам нужно получать события от ФС (ТЕ както реагировать на изменения файлов):
- вы под линуксом - копайте в сторону inotify...
- если под виндой - в сторону FindFirstChangeNotification

если нужно что-то вроди синхронизации - лучше чем rsync ничего не видела

Автор: denix 20.3.2009, 23:06
спасибо за ответы всем участникам

но мне нужна не синхронизация, а написать программу, которая отслеживает появление/изминение файлов, не знаю сна чем зацепиться

Автор: leneCaress 20.3.2009, 23:50
Цитата(denix @  20.3.2009,  23:06 Найти цитируемый пост)
но мне нужна не синхронизация, а написать программу, которая отслеживает появление/изминение файлов, не знаю сна чем зацепиться 


я уже писала:
Цитата(leneCaress @  20.3.2009,  21:38 Найти цитируемый пост)
если вам нужно получать события от ФС (ТЕ както реагировать на изменения файлов):
- вы под линуксом - копайте в сторону inotify...
- если под виндой - в сторону FindFirstChangeNotification


Автор: andrew_121 21.3.2009, 10:11
Это в раздел по WINAPI.

Автор: denix 21.3.2009, 20:08
а без винапи возможно написать?
может есть какие варианты?

Автор: leneCaress 21.3.2009, 21:42
хм... winapi это программный интерфейс самих виндов. любая программа для полноценной работе под виндой его использует.
без него - никак.

может быть у вас есть какая-то библиотека (mfc, vcl, qt....) которая работает поверх winapi и предоставляет удобный абстрагирующий интерфейс... но: если вам нужно серьезно взаимодействовать с ОС - извените - но придется работать с winapi

даже могу допустить что вам удастся найти библиотеку которая за вас будет вызывать winapi... но без него всеравно никуда smile

Автор: andrew_121 22.3.2009, 10:20
Цитата(leneCaress @  21.3.2009,  21:42 Найти цитируемый пост)
даже могу допустить что вам удастся найти библиотеку которая за вас будет вызывать winapi

Я в основном юзаю Qt. В нем есть все объекты для решения поставленной задачи.
QFileSystemWatcher

Автор: denix 24.3.2009, 13:53
тут написано http://ru.wikipedia.org/wiki/Rsync

Код

Алгоритм

Утилита rsync использует алгоритм, разработанный австралийским программистом Эндрю Триджеллом, для эффективной передачи структур (например файлов) по коммуникационным соединениям в том случае, когда принимающий компьютер уже имеет отличающуюся версию этой структуры.

Принимающий компьютер разделяет свою копию файла на неперекрывающиеся куски фиксированного размера S, и вычисляет контрольную сумму для каждого куска: MD4 хэш и более слабый 'rolling checksum', и отправляет их серверу, с которым синхронизируется.

Сервер, с которым синхронизируются, вычисляет контрольные суммы для каждого кусочка размера S в своей версии файла, в том числе перекрывающиеся куски. Это может быть эффективно подсчитано ввиду особого свойства rolling checksum: если rolling checksum байт от n до n+S-1 равняется R, то rolling checksum байт от n+1 до n+S может быть посчитана исходя из R, байта n и байта n+S без необходимости учитывать байты, лежащие внутри этого интервала. Таким образом, если уже подсчитана rolling checksum байт 1-25, то для подсчета rolling checksum байт 2-26 используется предыдущая контрольная сумма и байты 1 и 26.


1)никак не пойму зачем и что такое rolling checksum?
2) понятно, что Принимающий компьютер разделяет свою копию файла на неперекрывающиеся куски фиксированного размера S, и вычисляет контрольную сумму для каждого куска и сервер делает тоже самое со своей копией этого файла
непонятно для чего он считает для, цитирую: "Сервер, с которым синхронизируются, вычисляет контрольные суммы для каждого кусочка размера S в своей версии файла, в том числе перекрывающиеся куски"
Для чего он это делает? если он просто может сравнивать хеши кусков файла?

Автор: Vaulter 30.3.2009, 01:13
denix
Цитата(denix @  24.3.2009,  14:53 Найти цитируемый пост)
тут написано http://ru.wikipedia.org/wiki/Rsync

ой, чтото мне тоже страшно стало  smile 


Цитата(denix @  20.3.2009,  21:02 Найти цитируемый пост)
чтобы программа отслеживала изменения файловых ресурсов, т.е. появление новых файлов и папок, их удаления, изминения)


для слежения за изменением чеголибо - сохрани старое состояние, через промежуток времени посмотри новое - сравни smile

как в с++ это решить я не скажу, но в bash:

Код

watch -d 'ls -la'


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)