我有一个打开文件句柄到文件的进程。我需要检测此文件是否已被另一个进程删除(可能存在一个同名的文件)。在UNIX上,我通过stat比较我的文件句柄的inode和文件路径,但这在Win32上不起作用。我怎么能在Perl中做到这一点?
谢谢,
-Peter
答案 0 :(得分:7)
我可能弄错了(我不是Windows程序员),但我认为在Win32中打开文件时无法删除或替换文件,或者至少默认情况下不可能。
答案 1 :(得分:2)
这是一个难以解决的问题,尤其是在Windows和Unix上。
让我们回来吧。为什么要尝试检测文件是否已被替换?我的猜测是你有某种竞争条件,两个程序都试图写入同一个文件。也许文件锁定会有帮助吗?或者使用真正的数据库?想到SQLite和Berkley DB。
答案 2 :(得分:1)
我会尝试比较size,mtime和atime;对于那些相同的人来说应该是非常困难的(除了在win32上的文件句柄上的无意义,例如,stat,为您提供文件系统中当前文件的信息,无论您的文件句柄是否在已删除的实例上)。如果您的文件可能被删除并在给定的秒内被多次替换为相同的文件,并且您必须检测到这一点,那么您可能必须使用诸如使用文件的编号版本之类的架构解决方案。 / p>
答案 3 :(得分:1)
查看Win32 :: ChangeNotify包以注册文件或目录更改的通知。也可以通过Win32API :: File包打开文件,使其在打开时无法删除(尤其是createFile()和OsFHandleOpen(),以及MSDN上的CreateFile()文档)。