Actually, it is possible. Kinda. If you set the right share permission, the file can be deleted. Actually, it only gets flagged as being deleted. The file still appears in the directory until all file handles to it are closed. Open file handles still function. New handles can't be created. ("Access denied".)
For example,
use Win32API::File qw( createFile ReadFile CloseHandle );
$|=1;
my $share = $ARGV[0];
print("share: $share\n");
{
open(my $fh, '>', 'deleteme')
or die("Unable to create file: $!\n");
print $fh ("foo\n");
}
{
my $h = createFile('deleteme', 'r', $share)
or die("Unable to open file: $^E\n");
{
ReadFile($h, my $buf, 1, [], [])
or die("Unable to read from file: $^E\n");
print("Read $buf\n");
}
print("pre unlink dir: ");
system('dir /b deleteme');
print("pre unlink type: ");
system('type deleteme');
if (unlink('deleteme')) {
print("File deleted\n");
} else {
print("Unable to delete file\n");
}
print("post unlink dir: ");
system('dir /b deleteme');
print("post unlink type: ");
system('type deleteme');
{
ReadFile($h, my $buf, 1, [], [])
or die("Unable to read from file: $^E\n");
print("Read $buf\n");
}
print("pre CloseHandle dir: ");
system('dir /b deleteme');
print("pre CloseHandle type: ");
system('type deleteme');
CloseHandle($h);
print("post CloseHandle dir: ");
system('dir /b deleteme');
print("post CloseHandle type: ");
system('type deleteme');
}
outputs
>perl 549202.pl rw
share: rw
Read f
pre unlink dir: deleteme
pre unlink type: foo
Unable to delete file <---
post unlink dir: deleteme
post unlink type: foo
Read o
pre CloseHandle dir: deleteme
pre CloseHandle type: foo
post CloseHandle dir: deleteme
post CloseHandle type: foo
>perl 549202.pl rwd
share: rwd
Read f
pre unlink dir: deleteme
pre unlink type: foo
File deleted <---
post unlink dir: deleteme
post unlink type: Access is denied.
Read o
pre CloseHandle dir: deleteme
pre CloseHandle type: Access is denied.
post CloseHandle dir: File Not Found
post CloseHandle type: The system cannot find the file specified.
|