Как можно обнаружить изменения в каталоге при выполнении программы? - PullRequest
3 голосов
/ 23 июля 2010

Я делаю протокол, клиент и сервер, которые обеспечивают функции передачи файлов, аналогичные FTP (среди других функций). Одно из различий между моим протоколом и FTP заключается в том, что я хотел бы сохранить копию структуры каталогов удаленного сервера в локальном кэше. Сервер будет работать только в Windows (написанной на C ++), поэтому любые применимые вызовы Win32 API приветствуются (если таковые имеются). При первоначальном подключении клиент запрашивает непосредственные дочерние элементы (как файлы, так и каталоги, точно так же, как «ls» или «dir» без параметров), затем, когда пользователь переходит в каталог, этот шаг повторяется с новым родителем, как вы могли ожидать .

Конечно, в большинстве случаев, если клиент дважды запрашивает один и тот же каталог данного сервера, содержимое каталога будет одинаковым. Поэтому я хотел бы кэшировать результаты каждого списка каталогов на клиенте. Я хотел бы простой способ реализации этого, но он должен был бы принять во внимание истекающие записи кэша из-за доступа к файлу / каталогу и изменениям времени и изменения имени, что является сложной задачей. В идеале мне бы хотелось что-то, что позволило бы клиенту получить почти мгновенные списки каталогов, с чем-то вроде хэша, который учитывает не только содержимое файла, но также изменения в именах файлов содержимого подкаталогов, данных, датах изменения и доступа и т. Д.

Это НЕ то, что может полностью полагаться на объекты FileSystemWatcher (или аналогичные), потому что он должен поддерживать этот кеш, даже если программа запускается только изредка. Конечно, было бы неплохо помочь сохранить кеш, но это только часть проблемы.

Моя лучшая (?) Идея на данный момент - использовать FindFirstFile () и FindNextFile () и сортировать (каким-то образом), объединять и хэшировать значения, найденные в структурах WIN32_FIND_DATA (возможно, с содержимым файла), и использовать это в качестве токена для истечение срока действия (просто чтобы указать изменение в любом из этих полей). Тогда у меня будет один из этих токенов для каждого каталога. Когда запрашивается каталог, сервер хэширует все и сравнивает его с кэшированным хешем, предоставленным клиентом, и, если он отличается, возвращает нормальные данные, в противном случае эквивалент HTTP 304. Есть ли менее сложный способ сделать что-то подобное? Учитывает ли «дата последнего изменения каталога» все даты изменения файлов его подкаталогов при любых обстоятельствах? Я уверен, что встроенная служба индексирования Windows имеет что-то подобное, но в идеале мне не нужно было бы на это полагаться.

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

Мне интересно, что другие, более опытные в программировании, могли бы решить эту проблему (rsync и subversion решили аналогичные проблемы, но не идентичные).

1 Ответ

0 голосов
/ 23 июля 2010

Вы спрашиваете много о реализации файловой системы Very Little Brain (с извинениями перед А. А. Милном).

На самом деле это хорошо перевернутая земля, и вам стоит посмотреть на существующую литературу по распределенным файловым системам. AFS приходит на ум как пример очень хорошо изученного подхода.

Я сомневаюсь, что вы сможете придумать что-то полезное и точное, не выполняя серьезную домашнюю работу.Другими словами, было бы глупо игнорировать весь известный уровень техники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...