Какой лучший способ сделать кросс-платформенную атомарную замену файлов в Perl? - PullRequest
8 голосов
/ 24 декабря 2008

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

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

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

Вот код вопроса , для тех, кто заинтересован.

Ответы [ 3 ]

10 голосов
/ 24 декабря 2008

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

6 голосов
/ 24 декабря 2008

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

0 голосов
/ 24 декабря 2008

Переименовать достаточно. Тем не менее:

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

...