У меня есть коммерческое программное обеспечение, которое записывает информацию о клиентах в двоичный файл на сетевом диске Windows. Архитектура не позволяет мне использовать что-либо, кроме этого сетевого диска.
У меня есть приложение на C #, которое я написал для анализа данных из этого двоичного файла. Это приложение просто зацикливается на ожидании изменения этого файла, а затем анализирует информацию о клиенте в поисках того, что изменилось. Затем он обновит запись клиента в моей собственной пользовательской базе данных.
Проблема:
- Я использую коммерческий пакет для обновления записи о клиенте (я могу даже сделать шестнадцатеричный дамп файла и посмотреть модификацию)
- Мое приложение C # читает этот же файл (предположительно), но не видит обновлений клиентов. То, что он читает, идентично предыдущему разбору
Я парень из Linux, и моей первой мыслью было то, что я видел похожие проблемы в монтировании Linux NFS и исправил их, хотя это было так давно, что я не помню точное решение.
Я пробовал:
Использование редактора групповой политики для отключения автономных файлов для всех файлов. Это не сработало.
Общий длительный сон перед чтением обновленных двоичных файлов после изменения клиента. Это не сработало.
** Интересно отметить, что мой код обнаружит измененную временную метку и обработает ее, но содержимое, похоже, все еще кэшируется
Я трижды проверил все свои внутренние структуры данных, чтобы убедиться, что они чисты на каждой итерации. Там нет буферизованных данных.
Даже нашел один взлом онлайн, где парень сказал, что если вы добавляете файл в тот же каталог, а затем удаляете его, это каким-то образом вызывает обновление каталога. Это не сработало, но выдвинуло на первый план проблему. Если я создаю файл temp / hack, то сразу пытаюсь удалить его, он не работает, потому что мое приложение не видит новый файл hack. Даже после пары секунд сна между созданием и удалением.
Я попытался программным способом переместить этот файл с тем же именем файла с _ в конце, прежде чем читать его. Я думал, что написание этого нового файла, который всегда будет уникальным, каким-то образом заставит Windows предоставить мне последние и самые лучшие из этой папки. Когда я пытаюсь прочитать этот новый / уникальный файл, он говорит мне, что файл не найден, хотя я могу видеть его через Проводник Windows. Похоже, я читаю в какой-то кэшированной версии этого каталога.
Странное поведение теста:
- Если я остановлю свое приложение и перезапущу его, оно всегда будет считывать самую новую копию файла. Именно поэтому я сначала перепроверил все свои внутренние структуры данных, чтобы убедиться, что я не очищаю буфер или что-то еще. Но это не так.
Оперативно, есть несколько пользователей и сайтов, которые изменяют эти данные о клиентах, поэтому многие данные меняются очень быстро. Мне просто нужен способ заставить чтение фактического файла данных. Спасибо за любую помощь, которую может оказать любой из вас.
UPDATE:
Используя некоторые комментарии, я заставил его работать, но я бы не сказал, что на самом деле нашел решение. Это просто взломать. Я просто объединил все, что я думал, должно работать раньше (но не сделал) и дал ему тест. Сначала я копирую файл в ту же директорию за считанные секунды, так как эпоха завершилась до конца. Затем я зацикливаюсь на поиске этого файла, проверяя FileInfo.Exists. Когда он этого не видит, я FileInfo.Refresh (), сплю секунду, и попробуйте снова. Мне потребовалось до 15 секунд, чтобы вырваться из этого цикла в моем тестировании. Через минуту после этого произойдет ошибка, чтобы предотвратить бесконечный цикл. Затем я удаляю временный файл.
Опять же, я знаю, что это невероятно некрасиво и неопрятно, поэтому мне все еще интересно, у кого есть ответы на вопросы, как с этим справиться более правильно.