winapi — нужен эффективный способ обработки ReadDirectoryChangesW в переполнении стека

Я хочу получать уведомления об изменении в каталоге (добавление / удаление / обновление нового файла).
Я использовал API — «ReadDirectoryChangesW», который правильно уведомляет о любых изменениях в каталоге. Но API принимает буфер, в котором он возвращает информацию о файлах, добавленных / удаленных / измененных в каталоге.
Это создает ограничение, поскольку изменение в каталоге не является точным и иногда может быть огромным. Например: 1000 файлов добавляются в каталог.
В этом случае я всегда должен быть готов с достаточно большим буфером для хранения уведомлений обо всех 1000 файлах.

Я не хочу всегда создавать этот большой буфер.
Есть ли другой альтернативный способ, который является более эффективным?

1

Решение

Один из подходов, который вы могли бы использовать, — это использовать ReadDirectoryChangesW () как способ уведомления о том, что в каталоге произошли некоторые изменения, а затем использовать это уведомление как событие для просмотра каталога на предмет изменений.

Идея состоит в том, чтобы узнать, что изменилось самостоятельно, а не в зависимости от ReadDirectoryChangesW (), чтобы рассказать, что изменилось.

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

это статья об использовании ReadDirectoryChangesW () может помочь вам.

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

2

Другие решения

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

3

По вопросам рекламы [email protected]