Perl:撤消文件打开时取消链接

时间:2016-09-04 08:57:16

标签: perl file unlink

如果文件已打开,

unlink不会删除该文件;它只是删除名称和名称的链接。 unlink可以撤消吗?

open(my $fh, ">", undef) || die;
print $fh "foo";
# This does not work
link($fh,"/tmp/bar") || die;

未链接文件的打开文件句柄是否可以链接到文件?

2 个答案:

答案 0 :(得分:3)

如果可行,您可以将打开模式('>')更改为可读/写。然后,当您需要恢复文件时,您可以使用文件句柄将其打印到新打开的文件中,如果需要,即使使用相同的名称。

open my $fh, '+>', $file;
say $fh "line 1";
unlink $file;
say $fh "more lines";

seek $fh, 0, 0;
open my $fh_rec, '>', $file   or die "Can't open $file (again): $!";
print $fh_rec $_ while <$fh>;

这不是所要求的,但它恢复了文件内容和访问权限 它。进一步打印到$fh会使新$file不同步,因此可以在完成写入(恢复文件)或将打印切换到$fh_rec时完成此操作(然后{ {1}})。

恢复文件的另一种方法是使用操作系统,如果它使用close $fh并公开文件句柄。然后可以从/proc复制数据。要识别/proc/PID/fd/N,可以使用N扫描fd/(少数)ls -l中的所有链接,因为删除的文件名称后应该有(deleted)

此外,lsof -p PID列出了给定进程的所有打开文件描述符。已删除文件的文件包含(deleted)。 (lsof +L1 -p PID仅输出已删除的条目,但仍有不少。)从此输出中,我们可以读取该文件描述符,然后从/proc/PID/fd/N复制数据。这样我们也可以获得inode编号,也可以用来恢复文件。

答案 1 :(得分:0)

这些答案说:'不,不是一般的,绝对不是所有的Unices':

Relinking an anonymous (unlinked but open) file

https://serverfault.com/questions/168909/relinking-a-deleted-file

从打开的文件句柄中复制内容可能有效。