From 26872de184e4aa2ae92bae645782089e9656115d Mon Sep 17 00:00:00 2001
From: Phil Sturgeon
Date: Tue, 11 May 2010 11:41:59 +0100
Subject: Added an option to remove the preceding trail of empty folders when
creating a Zip archive.
---
system/libraries/Zip.php | 49 ++++++++++++++++++++++++++++++-------------
user_guide/changelog.html | 1 +
user_guide/libraries/zip.html | 12 ++++++++++-
3 files changed, 47 insertions(+), 15 deletions(-)
diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php
index 2c4bd255d..3ba3ddc83 100644
--- a/system/libraries/Zip.php
+++ b/system/libraries/Zip.php
@@ -270,27 +270,48 @@ class CI_Zip {
* @access public
* @param string path to source
* @return bool
- */
- function read_dir($path)
- {
- if ($fp = @opendir($path))
+ */
+ function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL)
+ {
+ if (!$fp = @opendir($path))
+ {
+ return FALSE;
+ }
+
+ // Set the original directory root for child dir's to use as relative
+ if ($root_path === NULL)
+ {
+ $root_path = dirname($path).'/';
+ }
+
+ while (FALSE !== ($file = readdir($fp)))
{
- while (FALSE !== ($file = readdir($fp)))
+ if(substr($file, 0, 1) == '.')
{
- if (@is_dir($path.$file) && substr($file, 0, 1) != '.')
- {
- $this->read_dir($path.$file."/");
- }
- elseif (substr($file, 0, 1) != ".")
+ continue;
+ }
+
+ if (@is_dir($path.$file))
+ {
+ $this->read_dir($path.$file."/", $preserve_filepath, $root_path);
+ }
+
+ else
+ {
+ if (FALSE !== ($data = file_get_contents($path.$file)))
{
- if (FALSE !== ($data = file_get_contents($path.$file)))
- {
- $this->add_data(str_replace("\\", "/", $path).$file, $data);
+ $name = str_replace("\\", "/", $path);
+
+ if ($preserve_filepath === FALSE)
+ {
+ $name = str_replace($root_path, '', $name);
}
+
+ $this->add_data($name.$file, $data);
}
}
- return TRUE;
}
+ return TRUE;
}
// --------------------------------------------------------------------
diff --git a/user_guide/changelog.html b/user_guide/changelog.html
index ae63b1f5f..08c98157b 100644
--- a/user_guide/changelog.html
+++ b/user_guide/changelog.html
@@ -95,6 +95,7 @@ Hg Tag:
Added a download() method to the FTP library
Changed do_xss_clean() to return FALSE if the uploaded file fails XSS checks.
Added stripslashes() and trim()ing of double quotes from $_FILES type value to standardize input in Upload library.
+ Added a second parameter (boolean) to $this->zip->read_dir('/path/to/directory', FALSE) to remove the preceding trail of empty folders when creating a Zip archive. This example would contain a zip with "directory" and all of its contents.
Database
diff --git a/user_guide/libraries/zip.html b/user_guide/libraries/zip.html
index 44603f2bc..844023b9e 100644
--- a/user_guide/libraries/zip.html
+++ b/user_guide/libraries/zip.html
@@ -177,7 +177,7 @@ $this->zip->download('my_backup.zip');
$this->zip->read_dir()
-Permits you to compress a folder (and its contents) that already exists somewhere on your server. Supply a file path to the
+
Permits you to compress a folder (and its contents) that already exists somewhere on your server. Supply a file path to the
directory and the zip class will recursively read it and recreate it as a Zip archive. All files contained within the
supplied path will be encoded, as will any sub-folders contained within it. Example:
@@ -189,6 +189,16 @@ $this->zip->read_dir($path);
$this->zip->download('my_backup.zip');
+By default the Zip archive will place all directories listed in the first parameter inside the zip. If you only want the end folder to be in the zip
+you can pass FALSE (boolean) in the second parameter. Example:
+
+
+$path = '/path/to/your/directory/';
+$this->zip->read_dir($path, FALSE);
+
+
+This will create a ZIP with the folder "directory" inside, then all sub-folders stored correctly inside that.
+
--
cgit v1.2.3-24-g4f1b