Не пишите свое собственное программное обеспечение именно так, можно "съесть собственный корм для собак". Вы просто создаете больше работы, когда Вы могли, вероятно, купить программное обеспечение, которое делает то же самое (и лучше) в течение меньшего количества времени и потраченных денег.
Я не знаю API пользовательского режима для уведомлений о закрытых файлах. Предложенная вами петля действительно, вероятно, лучший способ. Единственное, что вы могли бы сделать, это наблюдать за CloseFile
в драйвере фильтра, а также в Process Monitor, но фу ...
Я не думаю, что есть уведомление о том, что вы ищете, но в качестве улучшения я бы предложил прогрессивные задержки. Таким образом, вы получите быстрое время отклика на такие вещи, как перетаскивание и победа. Если пользователь держит файл открытым в Excel в течение часа.
int delay= 10;
while ((hFile = CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_SHARING_VIOLATION) {
Sleep (delay);
if (delay<5120) // max delay approx 5.Sec
delay*= 2;
}
else
break; // some other error occurred
}
Если вы знаете что-нибудь о том, как создается файл, возможно, подождите, пока файл перестанет расти в течение X секунд, или дождитесь удаления файла-дозорного. Или почувствуйте состояние программы, которая их создает.