Php 在调用close()之后,是否有任何方法可以比较ZipArchive对象?
在编写一些单元测试时,我偶然发现了一个异常困难的问题 简化场景:Php 在调用close()之后,是否有任何方法可以比较ZipArchive对象?,php,Php,在编写一些单元测试时,我偶然发现了一个异常困难的问题 简化场景: 创建了Zip存档 它由ZipArchive::addFromString()方法填充 它比关着的还多 在ZipArchive::open()中使用的文件名未知 代码示例 问题 比较zip存档的内容。比较方法可以使用类似于ZipArchive::statidex()的东西 理想情况下,不需要访问文件系统,只从内存中读取zip数据。基于注释 在这种特殊情况下,我不知道归档文件的文件名(不要问为什么),我只有ZipArchive的一个实
ZipArchive::addFromString()
方法填充ZipArchive::open()
中使用的文件名未知理想情况下,不需要访问文件系统,只从内存中读取zip数据。基于注释 在这种特殊情况下,我不知道归档文件的文件名(不要问为什么),我只有ZipArchive的一个实例 我想试试这样的东西:
class MyZipArchive extends ZipArchive{
protected $filename;
#override open
public function open($filename, $flags=null){
#store the filename
$this->filename = $filename;
return parent::open($filename,$flags);
}
public function getFilename(){
return $this->filename;
}
public function getFileHash(){
return md5_file($this->filename);
}
}
然后在代码中:
function zipUp() {
$zip = new MyZipArchive();
$zip->open(rand() . '.zip', ZipArchive::CREATE);
$zip->addFromString('test.txt', 'success');
$zip->close();
return $zip;
}
$zip1 = zipUp();
$zip2 = zipUp();
if($zip1->getFileHash() == $zip2->getFileHash()){
//do something
}
尝试,
hash\u file
很多次,我使用文件哈希作为文件名,并将“users”文件名存储在数据库中。避免了各种各样的问题。当然,这是完全匹配,如果您想要其他类型的匹配,您应该定义标准。理想情况下,不需要访问文件系统,只从内存读取zip数据。
据我所知,一旦关闭文件,它就不再在内存中。也就是说,没有理由以后不能重新打开该文件。@在这种情况下,我不知道归档文件的文件名(不要问为什么),我只有一个ZipArchive
的实例。我将创建一个ZipArchive的包装类(或扩展),您可以跟踪其中的文件名<代码>类MyZipArchive扩展ZipArchive{public function open($filename,$flags=null){$this->filename=$filename;parent::open($filename,$flags);}然后添加公共函数getFilename(){return$this->filename;}
问题解决。$zip->filename
function zipUp() {
$zip = new MyZipArchive();
$zip->open(rand() . '.zip', ZipArchive::CREATE);
$zip->addFromString('test.txt', 'success');
$zip->close();
return $zip;
}
$zip1 = zipUp();
$zip2 = zipUp();
if($zip1->getFileHash() == $zip2->getFileHash()){
//do something
}