我有一个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无法正常工作的问题-或者说这里的工作方式有所不同。
glob
和readdir
如何访问底层文件系统以确定内容的方式必须有所不同。另一个证明
还有另一种证明,它与重复数据删除有关:我将该功能配置为“仅”对3天以上的重复数据删除文件进行配置。
我设置了一个cronjob,“打开并查看”共享中的某个文件。大约3天后(Windows决定何时进行重复数据删除),glob无法在另一个客户端打开该文件时列出该文件。
因此,glob能够找到打开的文件,该文件在开始的三天之内已被复制到共享中-一旦删除了重复数据,它就会开始丢失它。
观察结果
球状
glob
失败,导致此帖子:-)扫描目录
使用提到的
scandir
函数可以显示和相同的行为:客户端打开的
opendir/readdir
我想再次在下划线,在两种情况下
opendir
和readdir
都可以使用。递归目录迭代器
这也随时产生了预期的结果。
文件属性
我注意到,重复数据删除的文件显示为“0字节的硬盘大小”,而尚未重复数据删除的文件(成功找到)显示为逻辑上占用的大小(基于文件系统的簇大小):
但是,这不能解释为什么文件是否由客户端打开会有所不同的原因。尺寸报告在任何时候都是相等的。
最佳答案
我不确定这是否是您要寻找的东西,但我使用
scandir()
列出目录中的所有文件,那么一旦知道名称,就可以对它们执行任何命令。
它也适用于打开的文件
PHP scandir documentation source
关于php - PHP的 “glob”和重复数据删除?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30969493/