如何检查文件是否已在Windows环境中使用

时间:2015-10-07 03:22:06

标签: perl file

我有一个小脚本可以从文件要复制到特定文件夹的目录中读取。我的脚本将从文件中读取并检查我们是否已收到所有已成功复制的文件。

一旦收到所有文件,就会触发下一组作业,处理这些文件。

我使用普通Input运算符来读取文件:

if(open(FILE,abc.txt))
  print "it opened \n";
} else {
  print "it did not open \n";
}

上述方法不起作用,读写(+<)也不起作用。为什么呢?

1 个答案:

答案 0 :(得分:1)

如果要检查文件是否存在,请尝试此操作:

if ( -e 'abc.txt' )
{
  print "file exists\n";
}

如果您要查看该文件是否可用于读/写访问(即确保编写该文件的另一个进程在Windows环境中没有锁定),那么最粗略的是您可以捕获无法打开文件的情况:

open(INFO,      "+<datafile") || warn("can't open datafile: $!");

在Windows中,我相信Determine whether a file is in use in Perl on Windows讨论了如何捕捉到失败但是看起来有点粗糙。

https://stackoverflow.com/a/4200474/5182165处的方法对我来说更令人满意。

我建议您在搜索中查看fileno()或fcntl或包含lsof以获取更多详细信息。

您可能还想查看http://docs.activestate.com/activeperl/5.8/lib/pods/perlopentut.html#file_locking

中描述的flock()

另一个有趣的方法是使用Win32 :: ChangeNotify查看文件更改目录,如Windows - Using perl monitor a directory for a new file drop/creation

中所述

或者您可以使用Win32 :: File :: Object来检查文件是否具有http://codeverge.com/perl.beginners/win32-file-attribs-example/144600的OFFLINE状态