我有一个php应用程序(按请求)扫描某些文件的存在。 (在网络共享上)

我为此使用glob,因为通常我只知道文件名的开头。

我注意到glob不返回任何客户端当前打开的文件,因此我的应用程序认为file_xy不存在(如果有人已打开)。

有没有办法使glob返回打开的(:=锁定?)文件?

奇怪的是,这里没有提到。但是我可以确认glob不会返回客户端当前打开的文件...(一旦客户端关闭正在访问的应用程序,glob将照常返回文件)

ps .:只要打开,glob("\\server\share\*")都不会返回文件。 (网络共享允许最大并发用户数)

    $dir = opendir ("\\server\share");
    while ($file = readdir($dir)){
      echo $file."<br />";
    }

可以显示问题文件完全正常,无论是否由其他客户端打开。 -所以我几乎可以排除任何访问限制/权限...

即使现在我不知道原因,我也已查明原因:

当文件位于使用Windows Server 2012 R2内置重复数据删除功能的驱动器上时,出现glob()找不到打开的文件的问题。

如果我将文件移动到非重复数据删除的共享中,即使被多个客户端打开,glob()也可以读取它。

由于我有一个可行的替代方案,因此该问题应主要集中于为何glob无法正常工作的问题-或者说这里的工作方式有所不同。 globreaddir如何访问底层文件系统以确定内容的方式必须有所不同。

另一个证明

还有另一种证明,它与重复数据删除有关:我将该功能配置为“仅”对3天以上的重复数据删除文件进行配置。

我设置了一个cronjob,“打开并查看”共享中的某个文件。大约3天后(Windows决定何时进行重复数据删除),glob无法在另一个客户端打开该文件时列出该文件。

因此,glob能够找到打开的文件,该文件在开始的三天之内已被复制到共享中-一旦删除了重复数据,它就会开始丢失它。

观察结果

球状
glob失败,导致此帖子:-)

扫描目录

使用提到的scandir函数可以显示相同的行为:

客户端打开的
  • 重复数据删除文件-在结果数组中缺少
  • 客户端未打开
  • 重复数据删除文件-结果数组的一部分。

  • opendir/readdir

    我想再次在下划线,在两种情况下opendirreaddir都可以使用。

    递归目录迭代器

    这也随时产生了预期的结果。

    文件属性

    我注意到,重复数据删除的文件显示为“0字节的硬盘大小”,而尚未重复数据删除的文件(成功找到)显示为逻辑上占用的大小(基于文件系统的簇大小):

    但是,这不能解释为什么文件是否由客户端打开会有所不同的原因。尺寸报告在任何时候都是相等的。

    最佳答案

    我不确定这是否是您要寻找的东西,但我使用
    scandir()
    列出目录中的所有文件,那么一旦知道名称,就可以对它们执行任何命令。
    它也适用于打开的文件

    PHP scandir documentation source

    关于php - PHP的 “glob”和重复数据删除?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30969493/

    10-13 09:33