通过Linux上的Php计数共享Windows驱动器上的文件

我在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多个文件.

解决方法:

您不能像这样处理手柄.如果它是popen返回的实际资源,则实际上您正在尝试尝试遍历Resource(12)/ *.msg(这意味着smbclient :: __ toString()将需要返回protocol:// username:password @ host / the / share / url,并且需要自动注册协议的流包装).

但是即使那样,它也不会起作用,因为glob仅适用于文件系统中存在的事物(因此实际上需要将其挂载)……SPL的GlobIterator似乎也是如此.

至少,您需要遍历每个文件并根据您的模式检查名称.因此,请记住,根据网络连接和共享上文件/目录的数量,此时任何解决方案都将变慢.

由于我不知道您正在使用的smb客户端的代码,您使用的不适,请举一个我确实知道如何使用的示例,它可以工作. munkie/samba是一个PHP SMB客户端,是系统smbclient的相应流包装器,因此您将需要使用与流一起使用的文件系统功能来利用它:

仅使用PHP(和应该内置的SPL)

使用SPL iterators,我们可以简化递归读取目录并搜索文件名的工作:

// 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组件

symfony/finder component使我们的工作变得更轻松,并且隐秘性降低.除了支持glob和正则表达式搜索模式外,它还实现了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或symfony / finder.但是,这可能会有些棘手,具体取决于您将其用作什么的性质以及您打算如何进行安装… Its been delved into a bit here.

最后,如果这些是邮箱中的电子邮件,则最好使用邮箱库/组件(如Zend_Mail)连接并计算邮件,这会更好.

上一篇:Linux——定时任务crontab


下一篇:使用Java和Samba JCIFS访问文件