当前位置: 首页 > 知识库问答 >
问题:

php“glob”和重复数据消除?

姜淇
2023-03-14

我有一个PHP应用程序(每个请求)扫描一些文件的存在。

为此,我使用了glob,因为通常我只知道文件名的开头。

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

是否有办法使glob返回打开(:=锁定?)还有文件吗?

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

ps.:甚至没有全局(\\server\share\*)返回文件,只要它打开。(网络共享允许最大并发用户数)

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

无论是否由其他客户机打开,都可以完美地显示有问题的文件。-所以我几乎可以排除任何访问限制/权限。。。

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

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

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

既然我有一个可行的替代方案,这个问题应该主要集中在为什么glob不起作用的问题上——或者说这里的工作不同。globreaddir访问底层文件系统以确定内容的方式必须有所不同。

还有另一个证据表明,这与重复数据消除有关:我将该功能配置为“仅”消除3天以上的重复数据。

我建立了一个cronwork,“打开并全球化”共享上的某个文件。一旦它是〜3天前(Windows决定何时删除重复),当它被另一个客户端打开时,Glob未能列出该文件。

因此,glob能够找到在前3天内复制到共享中的打开文件,然后在重复数据消除后开始丢失。

glob失败,导致此帖子:-)

使用前面提到的scandir函数可以显示非常相同的行为:

  • 由客户端打开的已消除重复数据的文件-在生成的阵列中丢失
  • 客户端未打开的重复数据消除文件-结果阵列的一部分

我想再次强调,opendirreaddir在这两种情况下都有效。

这也在任何时候产生了预期的结果。

我注意到,已消除重复的文件以0字节的“硬盘大小”显示,而未消除重复的文件(已成功找到)以其逻辑占用的大小显示(基于文件系统群集大小):

然而,这并不能解释为什么文件是否由客户端打开会有区别。大小报告在任何时候都是相等的。

共有3个答案

胡劲
2023-03-14

你试过了吗

$files = glob('{,.}*', GLOB_BRACE);

数据反欺骗功能可能会将打开的文件保持为隐藏文件。

狄冠宇
2023-03-14

如果重复数据消除的目的不是为了获得重复数据,那么这些文件将被锁定,而php无法看到它们,那么这是有意义的。唯一要做的就是看看这个限制是否也适用于scandir()和SPL目录/文件系统迭代器系列。如果是这样的话,可能无法获得它们的列表。

唯一的另一种选择是使用exec()和类似windows命令行的hack来查看是否可以获得文件列表,然后解析输出。这可能有用

php exec:不返回输出

祝你好运

谭宏盛
2023-03-14

我不确定这是否是您要查找的文件,但我使用scandir()列出目录中的所有文件,然后您可以在知道名称后对它们执行任何命令。它也可以处理打开的文件

PHP scandir留档源

 类似资料:
  • 我定义了一个类作为规则引擎的事件 它有以下成员1.电话号码2.纬度3.经度 我如何制定一个规则,其中1。该规则计算同一地点不同人数的数量2。同一人如果在1分钟的间隔内多次穿越同一地点,应仅计算为一个,不应重复 我制定了以下规则,但似乎不起作用 有人能帮忙吗? 问候Subbu

  • 本文向大家介绍php去除数组中重复数据,包括了php去除数组中重复数据的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接上代码 代码很简单,却非常的实用,有需要的小伙伴可以直接拿去用的。 另附上其他网友的解决办法 PHP数组去除重复项 有个内置函数array_unique (),但是php的 array_unique函数只适用于一维数组,对多维数组并不适用,以下提供一个二维数组 的 arr

  • 我在PHP(PDO)中遇到了这种情况; 我正在实现一个从MySql中检索数据的方法,并且做得很好,但问题是重复的数据恢复为关键骨,没有任何值,但其他数据附加更多,留下脚本和图像以了解更多细节; data.php 可变检验 json重复 预期结果

  • 我使用Slim框架创建了一个PHP API。问题是,当我将API移动到新服务器时,我开始对响应产生问题。响应正文中的数据正在复制 例如,不要在响应中只获取一次: {data:[{用户名:'某人',密码:'某物'}]} 我明白了: {data:[{用户名:'某人',密码:'某物' }] } {data:[{用户名:'某人',密码:'某物' }] } {data:[{用户名:'某人',密码:'某物'}

  • 问题内容: 这个问题已经在这里有了答案 : mysqli或PDO-优缺点是什么?[已关闭] (13个答案) 6年前关闭。 我刚刚完成了PHP入门课程,并且在整个stackoverflow论坛上,人们都建议我切换到PDO,准备好的语句或MYSQLi,我对手册进行了简短的检查,但其中大部分内容使我无所适从。 到目前为止,我一直在使用mysql_ *函数,因此这些概念对我来说是新的。我认为它们用于访问和