This code shows how to completely overwrite the data of a file. (Actually, not sure if it will DWIM on sparse files.)
The technique is illustrated in a sample practical application: "securely" erase and delete a file. (Note: does not securely erase and delete a file.)
use Fcntl; use strict; use warnings; my $blocksize = 2048; sub overwrite_file($;$) { my( $filename, $pattern ) = @_; -e $filename or die "File '$filename' does not exist.\n"; my $filesize = -s $filename; local *F; sysopen F, $filename, O_RDWR|O_BINARY or die "Can't overwrite '$filename' - $!\n"; if ( defined $pattern and length $pattern ) { $pattern x= 1 + $blocksize / length $pattern; substr( $pattern, $blocksize ) = ''; my $written = 0; $written += syswrite F, $pattern while $written < $filesize; } else { # use random bytes $pattern = "\0" x $blocksize; my $written = 0; while ( $written < $filesize ) { $pattern =~ s/(.)/ $1 ^ chr(rand 256) /seg; $written += syswrite F, $pattern; } } #sysseek F, 0, 0; # rewind close F; } sub shred_file($) { my $filename = shift; overwrite_file $filename, $_ for # byte patterns: "\xA5", "\x5A", '', # random bytes "\x00", "\xFF"; unlink $filename or die "Can't delete '$filename' - $!\n"; } @ARGV or die "Usage: $0 file file ...\n"; shred_file $_ for @ARGV;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: overwrite a file
by ikegami (Patriarch) on Apr 25, 2007 at 23:56 UTC | |
by varian (Chaplain) on Apr 26, 2007 at 06:19 UTC | |
by andreas1234567 (Vicar) on Jun 18, 2007 at 08:58 UTC | |
by jdporter (Paladin) on Jun 17, 2007 at 16:58 UTC |