

NAME
IO::File::AtomicChange - change content of a file atomically
SYNOPSIS
truncate and write to temporary file. When you call $fh->close, replace target file with temporary file preserved permission and owner (if possible).
my
$fh
= IO::File::AtomicChange->new(
"foo.conf"
,
"w"
);
$fh
->
(
"# create new file\n"
);
$fh
->
(
"foo\n"
);
$fh
->
(
"bar\n"
);
$fh
->
close
;
# MUST CALL close EXPLICITLY
If you specify "backup_dir", save original file into backup directory (like "/var/backup/foo.conf_YYYY-MM-DD_HHMMSS_PID") before replace.
my
$fh
= IO::File::AtomicChange->new(
"foo.conf"
,
"a"
,
{
backup_dir
=>
"/var/backup/"
});
$fh
->
(
"# append\n"
);
$fh
->
(
"baz\n"
);
$fh
->
(
"qux\n"
);
$fh
->
close
;
# MUST CALL close EXPLICITLY
DESCRIPTION
IO::File::AtomicChange is intended for people who need to update files reliably and atomically.
For example, in the case of generating a configuration file, you should be careful about aborting generator program or be loaded by other program in halfway writing.
IO::File::AtomicChange free you from such a painful situation and boring code.
INTERNAL
*
open
1. fix filename of temporary file by mktemp.
2.
if
target file already
exists
, copy target file to temporary file preserving permission and owner.
3.
open
temporary file and
return
its file handle.
*
write
1.
write
date into temporary file.
*
close
1.
close
temporary file.
2.
if
target file
exists
and specified
"backup_dir"
option, copy target file into backup directory preserving permission and owner, mtime.
3.
rename
temporary file to target file.
CAVEATS
You must call "$fh->close" explicitly when commit changes.
Currently, "close $fh" or "undef $fh" don't affect target file. So if you exit without calling "$fh->close", CHANGES ARE DISCARDED.
AUTHOR
HIROSE Masaaki <hirose31 _at_ gmail.com>
THANKS TO
kazuho gave me many shrewd advice.
REPOSITORY
https://github.com/hirose31/IO-File-AtomicChange
patches and collaborators are welcome.
SEE ALSO
IO::File, IO::AtomicFile, File::AtomicWrite
COPYRIGHT & LICENSE
Copyright HIROSE Masaaki 2009-
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
# for Emacsen # Local Variables: # mode: cperl # cperl-indent-level: 4 # cperl-close-paren-offset: -4 # cperl-indent-parens-as-block: t # indent-tabs-mode: nil # coding: utf-8 # End:
# vi: set ts=4 sw=4 sts=0 et ft=perl fenc=utf-8 ff=unix :