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 失败,导致这篇文章:-)
使用上面提到的scandir函数显示了相同的行为:
我想再次强调,opendir以及readdir两种情况下的作品.
这也随时产生了预期的结果.
我注意到,重复数据删除的文件显示为"硬盘驱动器上的大小",为0字节,而尚未执行重复数据删除的文件(已成功找到)以逻辑占用的大小显示(基于文件系统群集大小):
但是,这并不能解释为什么客户端是否打开文件会产生影响.尺寸报告在任何时候都是相同的.

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