/** * Remove the files that follow a given predicate from the source * If URL is null, the files will be removed from the source directly * Else, URL must link to a source from which the files will be removed * * @param File_Archive_Predicate $pred The files that follow the predicate * (for which $pred->isTrue($source) is true) will be erased * @param File_Archive_Reader $source A reader that contains the files to remove */ function removeFromSource(&$pred, &$toConvert, $URL = null) { $source =& File_Archive::_convertToReader($toConvert); if (PEAR::isError($source)) { return $source; } if ($URL === null) { $result =& $source; } else { if (substr($URL, -1) !== '/') { $URL .= '/'; } $result = File_Archive::readSource($source, $URL); } $writer = $result->makeWriterRemoveFiles($pred); if (PEAR::isError($writer)) { return $writer; } $writer->close(); }
function _testRemove($extension) { $writer = File_Archive::toArchive("test.{$extension}", File_Archive::toVariable($x)); $writer->newFile('foo.txt'); $writer->writeData('ABCDEF'); $writer->newFile('bla_to_remove.txt'); $writer->writeData('GHIJKL'); $writer->newFile('bar.txt'); $writer->writeData('MNOP'); $writer->close(); File_Archive::removeFromSource(File_Archive::predEreg('_to_remove'), $source = File_Archive::readSource(File_Archive::readMemory($x, "test.{$extension}"), "test.{$extension}/")); $this->assertEquals("foo.txt\nbar.txt", implode("\n", $source->getFileList())); }