Есть ли способ предотвратить кеширование Windows сетевых файлов? - PullRequest
0 голосов
/ 18 января 2019

У меня есть коммерческое программное обеспечение, которое записывает информацию о клиентах в двоичный файл на сетевом диске Windows. Архитектура не позволяет мне использовать что-либо, кроме этого сетевого диска.

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

Проблема:

  • Я использую коммерческий пакет для обновления записи о клиенте (я могу даже сделать шестнадцатеричный дамп файла и посмотреть модификацию)
  • Мое приложение C # читает этот же файл (предположительно), но не видит обновлений клиентов. То, что он читает, идентично предыдущему разбору

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

Я пробовал:

  • Использование редактора групповой политики для отключения автономных файлов для всех файлов. Это не сработало.

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

  • Я трижды проверил все свои внутренние структуры данных, чтобы убедиться, что они чисты на каждой итерации. Там нет буферизованных данных.

  • Даже нашел один взлом онлайн, где парень сказал, что если вы добавляете файл в тот же каталог, а затем удаляете его, это каким-то образом вызывает обновление каталога. Это не сработало, но выдвинуло на первый план проблему. Если я создаю файл temp / hack, то сразу пытаюсь удалить его, он не работает, потому что мое приложение не видит новый файл hack. Даже после пары секунд сна между созданием и удалением.

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

Странное поведение теста:

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

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

UPDATE: Используя некоторые комментарии, я заставил его работать, но я бы не сказал, что на самом деле нашел решение. Это просто взломать. Я просто объединил все, что я думал, должно работать раньше (но не сделал) и дал ему тест. Сначала я копирую файл в ту же директорию за считанные секунды, так как эпоха завершилась до конца. Затем я зацикливаюсь на поиске этого файла, проверяя FileInfo.Exists. Когда он этого не видит, я FileInfo.Refresh (), сплю секунду, и попробуйте снова. Мне потребовалось до 15 секунд, чтобы вырваться из этого цикла в моем тестировании. Через минуту после этого произойдет ошибка, чтобы предотвратить бесконечный цикл. Затем я удаляю временный файл.

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

...