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

时间:2015-02-12 16:00:42

标签: php linux popen smb

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

1 个答案:

答案 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的相应流包装器,因此您需要使用与流一起使用的文件系统函数来使用它:

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

使用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之类的邮箱库/组件来连接和统计邮件。