Мой вопрос - небольшая вариация вопроса Как лучше всего проверить, существует ли файл в Windows? , с некоторыми конкретными оговорками. В частности, данные расположены на подключенном диске, и используется протокол SMB 2.0. (По определению, для этого требуется, чтобы диск был сопоставлен с компьютером с Vista на компьютере с Vista или Server 2008.)
Проблема с ответами, опубликованными в ответ на вышеуказанный вопрос, заключается в том, что SMB 2.0 кэширует набор метаданных, включая имена файлов в заданном каталоге. В результате, если вы проверяете наличие файла, который был просто создан, то функции _access, access, GetFileAttributes и CreateFile (и, возможно, другие) будут использовать кэшированную информацию для ответа на вопрос " этот файл существует? " Если файл был совсем недавно создан другим пользователем, кеш указывает, что файл отсутствует, несмотря на тот факт, что он действительно существует. Я настроил тестовые среды для проверки этого, и я могу подтвердить, что no SMB2-трафик генерируется клиентом в течение нескольких секунд [предположительно, кэш-память истекает каждые 5 секунд или около того].
Кто-нибудь еще видел это? (Если да, нашли ли вы обходной путь, отличный от добавления задержки / повтора?) Кто-нибудь знает какой-либо API, аналогичный приведенному выше, который может проверять существование файла без использования кэша SMB? Или, что еще лучше, кто-нибудь знает о Windows API, который просто выдает кэшированные метаданные SMB?