我有一个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
访问底层文件系统以确定内容的方式必须有所不同。
还有另一个证明,这与数据重复数据删除有关:我将功能配置为&#34;仅&#34;重复删除超过3天的文件。
我设置了一个cronjob,&#34;打开并闪烁&#34;共享上的某个文件。一旦它大约3天(Windows决定何时进行重复数据删除),当它由另一个客户端打开时,glob无法列出该文件。
因此,glob能够找到打开的文件,这些文件在前3天内已被复制到共享中 - 然后在进行重复数据删除后开始错过它。
glob
失败,导致此帖: - )
使用上面提到的scandir
函数显示完全相同的行为:
我想再次强调,opendir
和readdir
同时适用。
这也随时产生了预期的结果。
我注意到,经过重复数据删除的文件显示为&#34;硬盘驱动器上的大小&#34; 0字节,但尚未删除重复数据删除的文件(已成功找到)以逻辑占用的大小显示(基于文件系统簇大小):
然而,这并不能解释为什么客户端是否打开文件会产生影响。尺寸报告在任何时候都是相同的。
答案 0 :(得分:1)
我不确定这是否是您正在寻找的但我使用的 SCANDIR() 列出目录中的所有文件,一旦知道名称,就可以执行任何命令。 它也适用于打开的文件
答案 1 :(得分:1)
如果重复数据删除的意图不是重复,那么这是有道理的,然后文件被锁定并且php无法看到它们。唯一要做的是查看此限制是否也适用于scandir()和SPL目录/文件系统迭代器系列。如果是这样,可能无法获得它们的列表。
唯一的另一种选择是使用exec()和Windows命令行进行黑客攻击,看看是否可以获取文件列表然后解析输出。这可能很有用
祝你好运!答案 2 :(得分:1)
你试过吗
$('.col-md-6').click(function() {
var $current = $(this).find('div:visible');
var $next = $current.next()
if ($next.length) {
$current.animate({
borderSpacing: -360
}, {
step: function(now, fx) {
$(this).css('-webkit-transform', 'rotateY(' + now + 'deg)');
$(this).css('-moz-transform', 'rotateY(' + now + 'deg)');
$(this).css('transform', 'rotateY(' + now + 'deg)');
},
complete: function() {
$(this).hide();
},
duration: 'slow'
}, 'swing');
$next.show();
}
});
数据重复数据删除功能有可能将打开的文件保留为隐藏文件。
答案 3 :(得分:0)
您准备使用除glob()
以外的其他功能吗?您可以尝试使用SPL的递归迭代器,如果它找到一个打开的文件,该文件位于使用Windows Server 2012 R2构建数据重复数据删除功能的驱动器上。您可以找到an example how you can use it from this link.