【问题标题】:How to check if a file is already in use in Windows environment如何检查文件是否已在 Windows 环境中使用
【发布时间】:2015-10-07 03:22:05
【问题描述】:

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

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

我正在使用普通的Input 操作符来读取文件:

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

上述方法无效,读写(+<)也无效。为什么?

【问题讨论】:

  • use strict; use warnings;
  • 有什么问题?
  • 文件被 ftp 到那个文件夹。所以我想考虑一个文件只有在文件完成复制到文件夹时才收到。我想如果我在将文件复制到(使用时)打开文件时打开它是不允许的。但是我可以在使用 file 时打开。我想验证一下..

标签: perl file


【解决方案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 处于离线状态

【讨论】:

  • 我实际上想检查文件是否已完全复制到驱动器中。所以我试图打开文件以检查文件是否仍在使用中(复制时),但即使文件被复制到该文件夹​​中(甚至文件正在使用中),我也能够打开文件...... . 我想验证一下,只有当文件成功复制到那个位置时,我才应该考虑使用那个文件....
  • 不确定您的用例是什么,但听起来您可能会通过查看 en.wikipedia.org/wiki/CwRsync 之类的内容来获得价值
猜你喜欢
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多