php"glob"和重复数据删除?

dog*_*ose 18 php glob windows-server-2012-r2

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

我正在使用glob这个,因为通常我只知道文件名的开头.

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

有没有办法让glob回复打开(:=锁定?)文件?

奇怪的是,这没有提到的地方.但是我可以确认glob不返回当前由客户端打开的文件...(一旦客户端关闭访问应用程序,glob将像往常一样返回文件)


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


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

无论是否由其他客户打开,都可以完美地显示相关文件. - 所以我几乎可以排除任何访问限制/许可的东西......


我想通了的原因,即使我不知道原因,现在:

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

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


由于我有一个可行的替代方案,这个问题应该主要关注为什么 glob不起作用的问题- 或者让我们说这里的工作不同.在如何glob以及readdir访问底层文件系统以确定内容方面必须有所不同.


另一个证明

还有另一个证明,这与数据重复数据删除有关:我将该功能配置为"仅"重复删除超过3天的文件.

我设置了一个cronjob,"打开并整理"共享中的某个文件.一旦它大约3天(Windows决定何时进行重复数据删除),当它由另一个客户端打开时,glob无法列出该文件.

因此,glob能够找到打开的文件,这些文件在前3天内被复制到共享中 - 然后在进行重复数据删除后开始错过它.

意见

glob的

glob 失败,导致这篇文章:-)

SCANDIR

使用上面提到的scandir函数显示了相同的行为:

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

opendir/readdir

我想再次强调,opendir以及readdir两种情况下的作品.

RecursiveDirectoryIterator

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

文件属性

我注意到,重复数据删除的文件显示为"硬盘驱动器上的大小",为0字节,而尚未执行重复数据删除的文件(已成功找到)以逻辑占用的大小显示(基于文件系统群集大小):

但是,这并不能解释为什么客户端是否打开文件会产生影响.尺寸报告在任何时候都是相同的.

重复数据删除文件的文件属性,而不是重复数据删除文件

Afi*_*eri 2

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

PHP scandir 文档源