This would not create a 100% sparse file because the last block would be all zero (even you print only one zero).
Fletch was right in his above post, the combination of
seek and
truncate must be used.
Here my first attempt from yesterday evening to create a halfway secure sub function which doesn't mess-up existing files:
sub create_sparse {
my ($file, $size) = @_;
return if -e $file && ! -f _;
return -2 if -e _ && -s _ >= $size;
open my $fh, '+>', $file or return;
eval {
seek $fh, $size, 0 or die;
truncate $fh, $size or die;
} or do {
close $fh;
return;
};
close $fh or return;
return -1;
}