Назад | Перейти на главную страницу

LockFile завершается успешно, но ReadFile не работает

Я знаю, что это звучит как вопрос программирования, но на самом деле это не так. Потерпи меня, пожалуйста:

У меня есть клиент, у которого возникла странная проблема, которую я не могу объяснить: программа использует файл на общем диске SMB (сервер Windows 2008R2), открытый в общем режиме.

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

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

В случае с моим клиентом эта программа (которая годами вела себя отлично во всех других местах) успешно блокирует файл, но последующий вызов ReadFile на том же дескрипторе завершается неудачно, и GetlastError возвращает ошибку 64. The specified network name is no longer available

Итак, мой вопрос:

Есть ли какие-то настройки в клиенте или сервере Windows SMB, которые могут вызвать что-то подобное?

Мне это кажется оптимистичной блокировкой, но окна по умолчанию не выполняют оптимистических блокировок (она делает оппортунистические блокировки).

Мое первое подозрение заключается в том, что эта проблема вызвана антивирусным программным обеспечением (Kaspersky), но администратор сайта клянется, что все AV имеют исключение для этого сетевого пути, как на клиенте, так и на файловом сервере.

Клиентская ОС представляет собой смесь Windows XP, 7, 2003 и 2008R2 (через службы терминалов). Кажется, это происходит только во время большой нагрузки (утром, когда все входят, или вечером, когда все выходят из системы).

Что ж, ответ был намного проще, чем я думал: неисправный драйвер устройства для сетевой карты сервера, очевидно, был причиной всех этих проблем.

Это действительно проблема программирования IMHO, но ее можно вернуть к тому, как она «работала» раньше, путем понижения версии вашей ОС. Windows 7 представила новый механизм блокировки в CIFS, который почти наверняка является причиной вашей проблемы. Это означает, что вам необходимо либо обновить программу, чтобы она работала с новой схемой блокировки (проблема программирования), либо вам необходимо перейти на более раннюю версию или найти исправление совместимости (проблемы администратора).

http://en.wikipedia.org/wiki/Server_Message_Block