【发布时间】:2010-07-09 09:14:13
【问题描述】:
我需要一个 FTP 服务器上所有文件(以及相关文件大小)的列表。我可以使用 CodeIgniter 的 FTP 类获取文件列表,但不知道如何获取文件大小。如何获取文件大小?谢谢。
【问题讨论】:
标签: php codeigniter ftp
我需要一个 FTP 服务器上所有文件(以及相关文件大小)的列表。我可以使用 CodeIgniter 的 FTP 类获取文件列表,但不知道如何获取文件大小。如何获取文件大小?谢谢。
【问题讨论】:
标签: php codeigniter ftp
刚刚快速浏览了 CodeIgniters FTP 类。由于它是为 PHP4 向后兼容编写的,如果你必须这样做,你可能可以这样做(黑客工作)。
<?php
$files = $this->ftp->list_files('/folder/');
foreach ($files as $file)
{
echo 'File:'. $file .' Size: '. ftp_size($this->ftp->conn_id, $file) .' <br />';
}
$this->ftp->close();
我不建议这样做 - 可能值得扩展主要的 CI ftp 类
class FTP extends CI_FTP
{
function FTP()
{
// call parent constructor
parent::CI_FTP();
}
// Single file size
function file_size($file)
{
return ftp_size($this->conn_id, $file);
}
}
将以上内容放入您的应用程序/库中并将其保存为 ftp.php。如果您正在运行 CI 的更新版本,它将加载您的扩展。
【讨论】:
我对 CodeIgniter 的 FTP 类一无所知,但是这个呢?
http://www.php.net/manual/en/function.ftp-rawlist.php
我假设 FTP 类的 list_files() 方法不提供此信息。对吗?
【讨论】:
ftp_rawlist() 可能需要使用 PHP 的内置功能打开 FTP 连接)。但是,看起来 CI 实际上并没有提供该功能。
请注意,有一个问题是 FTP 服务器禁用了某些功能,否则它不会让您调用 then(例如 filesize() 函数)。 此外,标准的 filesize() http://php.net/manual/en/function.filesize.php 函数应该在 ftp 上工作
【讨论】:
由于 CI 仍然与 PHP 4 兼容,您可能可以按如下方式快速而肮脏地完成它:
$this->load->library('ftp');
$config['hostname'] = 'ftp.example.com';
$config['username'] = 'your-username';
$config['password'] = 'your-password';
$config['debug'] = TRUE;
$this->ftp->connect($config);
$files = ftp_rawlist($this->ftp->conn_id, $path);
在 $files 中,每个文件应该有一行,包含文件权限、所有者/组、文件大小和文件名。您必须对其进行解析才能分别显示它们。
免责声明:只需复制/粘贴 CI 手册中的连接信息,根据 CI 源代码添加最后一行,YMMV:p。
【讨论】:
扩展CI FTP类比较简单:
class MY_FTP extends CI_FTP {
function MY_FTP()
{
parent::CI_FTP();
}
function get_file_size()
{
}
}
基本上只是让 get_ftp_size() 成为以下内容的包装器:
return ftp_size($conn, $file);
http://php.net/manual/en/function.ftp-size.php
我希望这会有所帮助(如果您遇到困难,只需浏览一下安装的 ftp.php 文件;您应该很快就会找到自己的方式)
编辑
由于 wimvds 正确地建议 ftp_rawlist() 可能是更可取/更简单的选项,我什至可以建议更改 list_files() 以使用 ftp_rawlist()。
【讨论】:
经过努力,这段代码运行良好!!!!我想与社区分享(通过 MundialSYS)
function dirFTPSize($ftpStream, $dir) {
$size = 0;
$files = ftp_nlist($ftpStream, $dir);
foreach ($files as $remoteFile) {
if(preg_match('/.*\/\.\.$/', $remoteFile) || preg_match('/.*\/\.$/', $remoteFile)){
continue;
}
$sizeTemp = ftp_size($ftpStream, $remoteFile);
if ($sizeTemp > 0) {
$size += $sizeTemp;
}elseif($sizeTemp == -1){//directorio
$size += dirFTPSize($ftpStream, $remoteFile);
}
}
return $size;
}
$hostname = '127.0.0.1'; // or 'ftp.domain.com'
$username = 'username';
$password = 'password';
$startdir = '/public_html'; // absolute path
$files = array();
$ftpStream = ftp_connect($hostname);
$login = ftp_login($ftpStream, $username, $password);
if (!$ftpStream) {
echo 'Wrong server!';
exit;
} else if (!$login) {
echo 'Wrong username/password!';
exit;
} else {
$size = dirFTPSize($ftpStream, $startdir);
}
echo number_format(($size / 1024 / 1024), 2, '.', '') . ' MB';
ftp_close($ftpStream);
好代码! 费尔南多
【讨论】:
get_file_info('path/to/file', $file_information)
给定文件和路径,返回名称、路径、大小、修改日期。第二个参数允许你显式声明你想要返回什么信息;选项有:名称、服务器路径、大小、日期、可读、可写、可执行、文件权限。如果找不到文件,则返回 FALSE。
【讨论】: