Если у вас нет контроля над процессом записи, то вы в какой-то момент обязательно где-то потерпите неудачу.
Если у вас есть контроль над писателем, простой способ «заблокировать» файлы - создать символическую ссылку. Если создание символической ссылки не удалось, запись уже выполняется. Если это удастся, вы только что приобрели «замок».
Но если у вас нет контроля над записью и созданием файла, возникнут проблемы. Вы можете попробовать подход, описанный здесь: Обеспечение того, чтобы моя программа не выполняла одновременную запись в файл
Это будет читать метки времени файла и «догадываться» из них, если запись завершена или нет. Это более надежно, чем проверка размера файла, так как вы можете получить файл с превышением порогового размера, но запись все еще продолжается.
В этом случае проблема заключается в том, что писатель начинает писать до того, как вы полностью прочитаете файл. Теперь ваш читатель потерпит неудачу, когда файл, который он читает, исчезнет на полпути.
Если вы работаете на платформе Unix, у вас нет контроля над записью, и вам абсолютно необходимо это сделать, я бы сделал что-то вроде этого:
- Проверьте, существует ли файл и существует ли он, если «последняя написанная» временная метка
"достаточно стар", чтобы я мог предположить, что файл там
- Переименовать файл под другим именем
- Проверьте переименованный файл, чтобы он все еще соответствовал вашим критериям
- Получить данные из переименованного файла
Тем не менее, это в конечном итоге не удастся, и вы потеряете обновление, поскольку нет способа сделать это атомарным. Переименование устранит проблему перезаписи файла до того, как вы его прочитаете, но если писатель решит начать запись между 1 и 2, вы не только получите неполный файл, но вы также можете разбить его, если ему не понравится файл исчезает на полпути.
Я бы лучше попытался найти способ каким-либо образом объединить действия. Либо ваш писатель запускает процесс чтения, либо добавляет механизм блокировки. Запись 1,5 ГБ данных не происходит мгновенно, и в конечном итоге произойдет неожиданное.
Или, если вы определенно не можете сделать ничего подобного, можете ли вы, например, убедиться, что ваш писатель пишет максимум один раз за N минут или около того? Если вы можете быть уверены, что он никогда не будет записывать дважды в течение 5-минутного окна, вы должны подождать в вашем считывателе, пока файлу не исполнится 3 минуты, а затем переименовать его и прочитать переименованный файл. Вы также можете проверить, можете ли вы помешать автору перезаписи. Если вы можете сделать это, то вы можете безопасно обработать файл в вашем считывателе, когда он «достаточно взрослый» и не изменился в течение какого-либо льготного периода, который вы решили дать ему, и когда вы прочитаете его, вы удалите файл, разрешив следующее обновление появится.
Не зная больше о вашей среде и процессах, это лучшее, что я могу придумать. Но нет универсального решения этой проблемы. Требуется обходной путь, адаптированный к вашей конкретной среде.