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

时间:2015-06-21 21:24:34

标签: 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 />";
    }
无论是否由其他客户打开,

都会完美地显示相关文件。 - 所以我几乎可以排除任何访问限制/许可的东西......

即使我现在不知道原因,我也想出了原因

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

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

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

另一个证据

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

我设置了一个cronjob,&#34;打开并闪烁&#34;共享上的某个文件。一旦它大约3天(Windows决定何时进行重复数据删除),当它由另一个客户端打开时,glob无法列出该文件。

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

观察

水珠

glob失败,导致此帖: - )

SCANDIR

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

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

opendir / readdir

我想再次强调opendirreaddir同时适用。

RecursiveDirectoryIterator

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

文件属性

我注意到,经过重复数据删除的文件显示为&#34;硬盘驱动器上的大小&#34; 0字节,但尚未删除重复数据删除的文件(已成功找到)以逻辑占用的大小显示(基于文件系统簇大小):

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

File Attributes of deduplicated and not deduplicated file

4 个答案:

答案 0 :(得分:1)

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

PHP scandir documentation source

答案 1 :(得分:1)

如果重复数据删除的意图不是重复,那么这是有道理的,然后文件被锁定并且php无法看到它们。唯一要做的是查看此限制是否也适用于scandir()和SPL目录/文件系统迭代器系列。如果是这样,可能无法获得它们的列表。

唯一的另一种选择是使用exec()和Windows命令行进行黑客攻击,看看是否可以获取文件列表然后解析输出。这可能很有用

php exec: does not return output

祝你好运!

答案 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.