Как лучше всего выполнить кроссплатформенную атомарную замену файлов в Perl?
-
23-08-2019 - |
Вопрос
У меня очень распространенная ситуация.У меня есть файл, и мне нужно полностью перезаписать его новым содержимым.Однако доступ к исходному файлу осуществляется при каждой загрузке страницы (это веб-приложение), поэтому он не может отсутствовать очень долго.Несколько мс — это нормально (хотя и не идеально), секунда — нет.
Прямо сейчас я делаю это, записывая временный файл в тот же каталог, а затем переименовывая этот временный файл в имя нового файла.Для этого я просто использую обычный File::Temp и «переименовываю» в Perl.Мне было интересно: есть ли другой рекомендуемый/лучший способ сделать это?Предпочтительно тот, который не требует модуля CPAN, поскольку это единственное место в моей системе, где мне нужно это сделать, и мне не нужна совершенно новая зависимость только для этого.
Да, и все это должно работать на Windows, Linux, BSD, OS X, Solaris и большинстве других распространенных платформ.
Вот код, о котором идет речь, для интересующихся.
Решение
Ваш метод кажется просто прекрасным.Это быстро, атомарно, использует только основные модули, а File::Temp — безопасный способ работы с временными файлами.Что еще тебе нужно?
Другие советы
Я бы сделал это так же, как ты это делаешь.По крайней мере, в ОС типа Unix переименование файла гарантированно будет атомарным, поэтому у вас не будет моментов, когда исходного или нового файла не будет.
Переименования достаточно.Однако:
Подвергается ли ваш временный файл риску возникновения гонок?Имя файла должно быть случайным, чтобы никто не мог вызвать проблемы, вставив свой собственный файл.Если возможно, используйте интерфейс mkstemp().