Как лучше всего выполнить кроссплатформенную атомарную замену файлов в Perl?

StackOverflow https://stackoverflow.com/questions/392016

Вопрос

У меня очень распространенная ситуация.У меня есть файл, и мне нужно полностью перезаписать его новым содержимым.Однако доступ к исходному файлу осуществляется при каждой загрузке страницы (это веб-приложение), поэтому он не может отсутствовать очень долго.Несколько мс — это нормально (хотя и не идеально), секунда — нет.

Прямо сейчас я делаю это, записывая временный файл в тот же каталог, а затем переименовывая этот временный файл в имя нового файла.Для этого я просто использую обычный File::Temp и «переименовываю» в Perl.Мне было интересно: есть ли другой рекомендуемый/лучший способ сделать это?Предпочтительно тот, который не требует модуля CPAN, поскольку это единственное место в моей системе, где мне нужно это сделать, и мне не нужна совершенно новая зависимость только для этого.

Да, и все это должно работать на Windows, Linux, BSD, OS X, Solaris и большинстве других распространенных платформ.

Вот код, о котором идет речь, для интересующихся.

Это было полезно?

Решение

Ваш метод кажется просто прекрасным.Это быстро, атомарно, использует только основные модули, а File::Temp — безопасный способ работы с временными файлами.Что еще тебе нужно?

Другие советы

Я бы сделал это так же, как ты это делаешь.По крайней мере, в ОС типа Unix переименование файла гарантированно будет атомарным, поэтому у вас не будет моментов, когда исходного или нового файла не будет.

Переименования достаточно.Однако:

Подвергается ли ваш временный файл риску возникновения гонок?Имя файла должно быть случайным, чтобы никто не мог вызвать проблемы, вставив свой собственный файл.Если возможно, используйте интерфейс mkstemp().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top