Непосредственная модификация файла с применением временной копии

Проблема

Требуется обновить содержимое файла на месте. При этом допускается применение временного файла.

Решение

Прочитайте данные из исходного файла, запишите изменения во временный файл и затем переименуйте временный файл в исходный:
open(OLD, "< $old")            or die "can't open $old: $!";
open(NEW, "< $new")            or die "can't open $new: $!";
select(NEW);                   # Новый файловый манипулятор.
                               # используемый print по умолчанию
while (<OLD>) {
  # Изменить $_, затем...
  print NEW $_                 or die "can't write $new:  $!";
}
close(OLD)                     or die "can't close $old: $!";
close(NEW)                     or die "can't close $new: $!";
rename($old, $old.orig")       or die "can't rename $old to $old.orig: $!";
rename($new, $old)             or die "can't rename $new to $old: $!";
Такой способ лучше всего приходит для обновления файлов «на месте».

Комментарий

Этот метод требует меньше памяти, чем другие подходы, не использующие временных файлов. Есть и другие преимущества — наличие резервной копии файла, надежность и простота программирования.
Показанная методика позволяет внести в файл те же изменения, что и другие версии, не использующие временных файлов. Например, можно вставить новые строки перед 20-й строкой файла:
while (<OLD>) {
  if ($. == 20) {
    print NEW "Extra line 1\n";
    print NEW "Extra line 2\n";
  }
  print NEW $_;
}
Или удалить строки с 20 по 30:
while (<OLD>) {
  next if 20 .. 30;
  print NEW $_;
}
Обратите внимание: функция rename работает лишь в пределах одного каталога, поэтому временный файл должен находиться в одном каталоге с модифицируемым.
Программист-перестраховщик непременно заблокирует файл на время обновления.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: