在包含数千个文件的文件夹中匹配文件名的更快方法

发布于 2024-11-28 09:02:24 字数 504 浏览 0 评论 0 原文

我使用这个 readdir 在文件夹中查找文件

$handler = opendir($folder);

while ($file = readdir($handler)) {

  if ($file != "." && $file != ".." && substr($file,0,7) == '98888000') {
    print $file. "<br />";
  }

}

,但由于文件夹中有大量文件,因此需要几分钟才能完成请求:如何加快速度?
考虑一下我使用的是 PHP5 + IIS。

我什至尝试过 glob()

foreach (glob($folder.98888000."*.pdf") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

但它什么也没返回。

I was using this readdir to find a file in a folder

$handler = opendir($folder);

while ($file = readdir($handler)) {

  if ($file != "." && $file != ".." && substr($file,0,7) == '98888000') {
    print $file. "<br />";
  }

}

but since I have tons of files in the folder it takes some minutes to complete the request: how can I fast it up?
Consider I'm on PHP5 + IIS.

I've tried even glob()

foreach (glob($folder.98888000."*.pdf") as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

but it returned nothing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

握住你手 2024-12-05 09:02:24

glob 怎么样?它找到与模式匹配的文件:

glob('98888000*')

可能有效。

如果您需要 opendirreaddir,那么您可能需要看看 fnmatch

What about glob maybe? It finds files matching a pattern:

glob('98888000*')

might work.

If you need opendir and readdir, then you might want to have a look at fnmatch.

忘年祭陌 2024-12-05 09:02:24

首先检查 $folder 末尾是否包含 /,这可能会导致 glob 出现问题(模式是错误的) 。因此,根据需要添加内容并删除编写适当的 glob 模式不需要的内容:

$folder = realpath($folder);
foreach (glob($folder.'/98888000*', GLOB_NOSORT) as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

我使用了 GLOB_NOSORT 出于速度原因。

您可以使用 glob() >GlobIterator

$folder = realpath($folder);
$query = $folder.'/98888000*';
foreach(new GlobIterator($query) as $file)
{
    $name = $file->getFilename();
    $size = $file->getSize();
    echo "$name size $size \n";
}

相关: 迭代目录中的特定文件9 种迭代目录的方法PHP

First check if $folder contains a / at it's end or not, this could have caused your problem with glob (the pattern was just wrong). So add things as needed and remove those things not needed to write a propper glob pattern:

$folder = realpath($folder);
foreach (glob($folder.'/98888000*', GLOB_NOSORT) as $filename) {
    echo "$filename size " . filesize($filename) . "\n";
}

I used the GLOB_NOSORT for speed reasons.

Instead of using glob() you can make use of the GlobIterator class:

$folder = realpath($folder);
$query = $folder.'/98888000*';
foreach(new GlobIterator($query) as $file)
{
    $name = $file->getFilename();
    $size = $file->getSize();
    echo "$name size $size \n";
}

Related: Iterate over specific files in a directory and 9 Ways to Iterate Over a Directory in PHP.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文