如何使用Perl在Windows上检测打开文件句柄所对应的文件是否已被删除?

3

我有一个正在使用文件句柄的进程。我需要检测是否有其他进程删除了该文件(可能会有一个同名文件代替它)。在UNIX上,我通过使用stat比较我的文件句柄和文件路径的inode来实现,但这在Win32上不起作用。我应该如何在Perl中实现这一点?

谢谢,
-Peter

4个回答

7

我可能错了(我不是Windows程序员),但我认为在Win32中打开文件时不能删除或替换文件,或者默认情况下是不可能的。


是的,据我所知,Windows不允许删除正在打开的文件。 - Powerlord
是的,这就是根本问题。我不得不通过每次写入文件时重新打开文件来解决它,然后创建并比较唯一的文件ID(通过组合卷序列号和内核API调用GetFileInformationByHandle获取的文件高/低索引生成)。 - user24881

2

这是一个很难解决的问题,特别是在Windows和Unix两个平台上。

让我们回到问题本身。你为什么要检测文件是否被替换了?我猜可能存在一些竞争条件,即两个程序都试图写入同一个文件。也许文件锁定可以帮助解决这个问题?或者使用真正的数据库?SQLite和Berkley DB可能是不错的选择。


1

我会尝试比较文件大小、修改时间和访问时间;这些应该很难相同(除非像在win32上对文件句柄进行stat,无论您的文件句柄是否在已删除的实例上,都会为您提供文件系统中当前文件的信息)。如果您的文件可能在给定的一秒钟内被删除并替换为多个相同的文件,并且您必须检测到此情况,则可能需要采用类似使用文件的编号版本等架构解决方案。


1

查看Win32::ChangeNotify包以注册文件或目录更改通知。还可以通过Win32API::File包打开文件,使其在您打开的同时无法被删除(特别是请参阅createFile()和OsFHandleOpen(),以及MSDN上的CreateFile()文档)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接