如何用PHP脚本和PEAR类创建ZIP档案文件
在开发Web利用程序时,很有可能您会碰到不同格式的文件——CSV数据、密码文件、XML编码的内容和不同情势的2进制的数据。您的PHP脚本将需要频繁地和这些文件交互,从中读取数据和将数据写进其中。由于有这么些格式的文件要处理,所以您就不要意外PHP中有那末多种类型的内置函数和外部的库,用来连接和使用几近所有您能说出名称的文件格式。
这篇指南就是关于这样1种文件格式的,可能利用程序开发者几近每天都会碰到这类文件:ZIP格式。1般这类格式是用来通过电子邮件和远程连接传输文件的,能够将多个文件紧缩到1个档案文件中,因此,减少了文件的硬盘占据空间,并且能够更轻易地移动它们。PHP通过它的ZZipLib插件和PEAR的Archive_Zip类都可以读取和创建这些ZIP文件。
我将假定您已有了正常运行的Apache,安装了PHP,并且PEAR Archive_Zip class类已正确安装了。
留意:您可以直接从网上安装PEAR Archive_Zip程序包,要末下载它,还可以利用提供的唆使。
创建ZIP档案文件
让我们从1个简单的例子开始:动态地创建1个包括几个其他文件的ZIP档案文件。以列表A中的脚本开始。
列表A
include ('Archive/Zip.php'); // imports
$obj = new Archive_Zip('test.zip'); // name of zip file
$files = array('mystuff/ad.gif',
'mystuff/alcon.doc',
'mystuff/alcon.xls'); // files to store
if ($obj->create($files)) {
echo 'Created successfully!';
} else {
echo 'Error in file creation';
}
?>
这个脚本非常简单,但是值得仔细看1下:
首先,第1步是创建1个Archive_Zip类的实例,然后用将要创建的档案文件的路径和名称将其初始化。在这个例子中,档案文件被命名为test.zip,位于当前目录下。
接着,初始化1个数组,列出将要被紧缩的文件,和它们在硬盘中的位置1起保存其中;这些位置用尽对或相对术语列进,但是,1个关键的要考虑的事项是脚本对那些文件或磁盘的位置要有读取的权限。
最后,用create()方法通过紧缩和合并指定的文件来实际构建档案文件。这个方法接受文件列表作为输进,然后返回1个布尔逻辑值唆使档案文件是否是被成功创建。留意脚本在文件被创建的目录下必须有写进特权是非常重要的,否则create()方法将失败;这是1个普遍的,也让大部份新手失败的毛病。
现在,在修改了源文件列表和目标文件位置来反应您的本地系统配置以后,试着运行上面的脚本。假设1切顺利的话,Archive_Zip应当可以找到您所列出的、并紧缩到名为test.zip的ZIP档案文件中的文件。
查看ZIP档案文件的内容
那末怎样样看到现有的ZIP档案文件中的内容呢?Archive_Zip lets让您通过它的listContent()方法也能够做到这1点。下面是1个例子(列表B):
列表B
include ('Archive/Zip.php'); // imports
$obj = new Archive_Zip('test.zip'); // name of zip file
$files = $obj->listContent(); // array of file information
foreach ($files as $f) {
foreach ($f as $k => $v) {
echo "$k: $v\n";
}
echo "\n";
}
?>
listContent()的输出是1个由数组组成的结构数组,每1个数组元素代表档案文件中的1个单独文件。通常,每1个元素中保存有相干的信息,例如对应文件的名字、它的索引位置、状态、大小(紧缩后和紧缩前的)和最近1次修改的时间。用1个循环可以很轻易地将这些信息提取出来,还可以像列表B那样,重定它的格式,使其更好传输。下面是输出的1个示例(列表C):
列表C
filename: mystuff/alcon.xls
stored_filename: mystuff/alcon.xls
size: 113664
compressed_size: 35902
mtime: 1141996836
comment:
folder:
index: 0
status: ok
向现有的ZIP档案文件中添加新文件
Archive_Zip类的1个故意思的特性就是它可以通过add()方法向现有的档案文件中添加新的文件。为了说明这1点,让我们回到test.zip,尝试对它添加新文件(列表D):
列表D
include ('Archive/Zip.php'); // imports
if (file_exists('test.zip')) {
$obj = new Archive_Zip('test.zip'); // name of zip file
} else {
die('File does not exist');
}
$files = array('otherstuff/montecarlo.png'); // additional files to store
if ($obj->add($files)) {
echo 'Added successfully!';
} else {
echo 'Error in file addition';
}
?>
正如您所看到的那样,向1个现有的档案文件中添加新文件的程序和创建1个新的档案文件10分类似:初始化1个新的Archive_Zip对象指向问号代表的档案文件,创建1个数组代表将要添加的文件的列表,然后将这个数组输进add()方法。和create()方法1样,add()返回1个布尔逻辑信号来唆使添加是否是成功。和前面1样,1个主要的题目就是别忘了要有足够的权限:记得确保脚本有适当的权限来读取源文件,并将新紧缩的档案文件写回到硬盘中。
从现有的ZIP档案文件中删除文件
和添加文件1样,您也能够删除文件。Archive_Zip类具有delete()方法,让您能够从现有的档案文件中移除文件。列表E说明了这1点。.
列表E
include ('Archive/Zip.php'); // imports
if (file_exists('test.zip')) {
$obj = new Archive_Zip('test.zip'); // name of zip file
} else {
die('File does not exist');
}
$files = array('mystuff/ad.gif', 'otherstuff/montecarlo.png'); // files to delete
if ($obj->delete(array('by_name' => $files))) {
echo 'Deleted successfully!';
} else {
echo 'Error in file deletion';
}
?>
在这里,创建了1个待删除文件的数组,然后将其输进delete()方法。留意delete()调用中的特殊参数“by_name”:这告知Archive_Zip只删除那些与文件名精确匹配的文件。假设删除成功,delete()方法返回真。
除这类情势的有选择的删除之外,delete()方法也支持对与特定类型或正则表达式相匹配文件的大范围的摧毁。利用“by_ereg”或“by_preg”参数,Perl和PHP的正则表达式都支持。列表F是1个例子,用来讲明怎样用这类方法,通过利用Perl的正则表达式来删除1个档案文件中所有的*.doc文件。
列表F
include ('Archive/Zip.php'); // imports
if (file_exists('test.zip')) {
$obj = new Archive_Zip('test.zip'); // name of zip file
} else {
die('File does not exist');
}
if ($obj->delete(array('by_preg' => "/.*doc$/"))) { // all DOC files
echo 'Deleted successfully!';
} else {
echo 'Error in file deletion';
}
?>
如以上的例子所示,PEAR的Archive_Zip类用处很多,只需要几行代码,就使您能够履行1些相当复杂的与ZIP文件的交互。希看上面的示例脚本能够激起起您的灵感,告知您如何在您的平常开发活动中使用这个类,并让您对用它进行实验产生爱好。祝您编程开心!
请作者联系本站,及时附注您的姓名。联系邮箱:edu#chinaz.com(把#改成@)。
唐山网站建设www.fw8.netTAG:方法,文件,脚本,列表,数组
评论加载中...
|