我在Windows共享文件夹上有扩展名为.msg的文件,我的php服务器是Linux(LAMP服务器)。我正在尝试编写一个php脚本,它只计算Windows共享文件夹中.msg文件的数量。
我正在使用smbclient类,这就是我写的:
<?php
require_once ('smbclient.php');
$smbc = new smbclient ('//192.168.10.14/reservations', 'user', 'pass');
$handle = popen ($smbc);
$files = glob($handle . '*.msg');
$filecount = count( $files );
echo $filecount;
?>
但是,我总是得到0作为输出,但有超过200个文件。
答案 0 :(得分:2)
你不能glob
这样的句柄。如果它是Resource (12)/*.msg
返回的实际资源(意味着popen
需要返回smbclient::__toString()
并且需要自动生成) 为protocol://username:password@host/the/share/url
)注册了一个流包装器。
但即便如此,它也不会起作用,因为protocol
只适用于文件系统中存在的东西(因此需要实际安装)......似乎也是SPL&#39的情况; s glob
。
至少,您需要遍历每个文件并根据您的模式检查名称。所以请记住,此时的任何解决方案都会有些慢,具体取决于网络连接和共享上的文件/目录数量。
由于我不知道你实现的smb客户端的代码,你正在使用ill给你一个例子,我知道如何使用,这是有效的。 munkie/samba
是PHP SMB客户端和系统GlobIterator
的相应流包装器,因此您需要使用与流一起使用的文件系统函数来使用它:
使用SPL iterators我们可以简单地递归读取目录并搜索文件名:
smbclient
// assuming you installed via composer so use its autoloder
$autoloader = require_once('vendor/autoload.php');
use Samba\SambaStreamWrapper;
SambaStreamWrapper::register();
$dir = new RecusrsiveDirectoryIterator(new DirectoryIterator(
'smb://username:password@192.168.10.14/reservations'
));
$finder = new RegexIterator($dir, '#^.+\.msg$#i', RecursiveRegexIterator::MATCH);
$count = 0;
foreach($finder as $match) {
$count++;
}
echo $count;
组件 symfony/finder
component使我们的事情变得更容易,而且不那么神秘。除了支持globs和regex搜索模式之外,它还实现了symfony/finder
,因此我们可以调用Countable
来获取计数而不是循环结果并手动计算它们(尽管在内部它仍然需要迭代结果算数)。它还使更复杂的搜索更容易使用。听起来并不是你现在需要的支持,但它可能会在以后出现:
$var->count()
您在这里的另一个选择是实际安装共享,然后使用// assuming you installed via composer so use its autoloder
$autoloader = require_once('vendor/autoload.php');
use Samba\SambaStreamWrapper;
use Symfony\Component\Finder\Finder;
SambaStreamWrapper::register();
$finder = new Finder();
$finder
->files()
->name('*.msg')
->in('smb://username:password@192.168.10.14/reservations');
// YAY Countable!
echo $finder->count();
,glob()
或GlobIterator
。但这可能会有点棘手,具体取决于您使用它的性质以及您希望如何安装它...... Its been delved into a bit here。
最后,如果这些是邮箱中的电子邮件,您最好使用Zend_Mail
之类的邮箱库/组件来连接和统计邮件。