Update with suggestions from gaker & dixy
diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php
index 3c66c6b..7a97914 100644
--- a/system/libraries/Zip.php
+++ b/system/libraries/Zip.php
@@ -97,7 +97,7 @@
 	 *	@param string	path to file
 	 *	@return array	filemtime/filemdate
 	 */
-	private function _get_mod_time($dir)
+	protected function _get_mod_time($dir)
 	{
 		// filemtime() may return false, but raises an error for non-existing files
 		$date = (file_exists($dir)) ? filemtime($dir): getdate($this->now);
@@ -115,11 +115,11 @@
 	/**
 	 * Add Directory
 	 *
-	 * @access	private
+	 * @access	protected
 	 * @param	string	the directory name
 	 * @return	void
 	 */
-	private function _add_dir($dir, $file_mtime, $file_mdate)
+	protected function _add_dir($dir, $file_mtime, $file_mdate)
 	{
 		$dir = str_replace("\\", "/", $dir);
 
@@ -194,12 +194,12 @@
 	/**
 	 * Add Data to Zip
 	 *
-	 * @access	private
+	 * @access	protected
 	 * @param	string	the file name/path
 	 * @param	string	the data to be encoded
 	 * @return	void
 	 */
-	private function _add_data($filepath, $data, $file_mtime, $file_mdate)
+	protected function _add_data($filepath, $data, $file_mtime, $file_mdate)
 	{
 		$filepath = str_replace("\\", "/", $filepath);
 
@@ -288,6 +288,8 @@
 	 */
 	public function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL)
 	{
+		$path = rtrim($path, '/\\').DIRECTORY_SEPARATOR;
+
 		if ( ! $fp = @opendir($path))
 		{
 			return FALSE;
@@ -425,6 +427,7 @@
 		$this->entries		= 0;
 		$this->file_num		= 0;
 		$this->offset		= 0;
+		return $this;
 	}
 
 }