gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:08:53 26 4
gpt4 key购买 nike

我有一个 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 访问底层文件系统以确定内容的方式肯定有所不同。


另一个证明

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

我设置了一个 cronjob,“打开并遍历”共享上的某个文件。大约 3 天后(Windows 决定何时进行重复数据删除),glob 在文件被另一个客户端打开时无法列出该文件。

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

观察

全局

glob 失败,导致这篇文章 :-)

丑闻

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

  • 删除了客户端打开的重复文件 - 结果数组中丢失
  • 删除了客户端未打开的重复文件 - 结果数组的一部分。

opendir/读取目录

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

递归目录迭代器

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

文件属性

我注意到,已删除重复的文件显示为 0 字节的“硬盘驱动器大小”,而尚未删除重复的文件(已成功找到)显示为它们在逻辑上占用的大小(基于文件系统簇大小) :

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

File Attributes of deduplicated and not deduplicated file

最佳答案

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

PHP scandir documentation source

关于php "glob"和重复数据删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30969493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com