tomfmason Posted September 5, 2006 Share Posted September 5, 2006 I have a function that will search a diectory and enter all files and sub directories into a zip file. The problem is that it dosn't add any subfolders with the files in them. When I unzipped the file I found that there were two files with the .file extenstion that were supposed to be a directory.here is the function.[code]<?phpinclude_once('includes/zip.class.php');function zipfiles($dir) { $newzip = new createZip; $newzip -> addDirectory('main/'); static $files = array(); static $dirs = array(); $handle = opendir($dir); while (($file = readdir($handle)) !== false) { if (!in_array($file, array('.', '..'))) { if (is_dir($path = ($dir . DIRECTORY_SEPARATOR . $file))) { $newzip -> addDirectory("main/" . $file); $dirs[] = $path; zipfiles($path); } else { $files[] = $path; $contents = file_get_contents($path); $newzip -> addFile($contents, "main/" . $file); } } } $zipname = "test.zip"; $fp = fopen($zipname, "wb"); $out = fwrite($fp, $newzip -> getZippedfile($zipname)); fclose($fp); if (file_exists("./$zipfile") == true) { $result = "The zipfile ($zipname) was created"; }else{ $result = "The zipfile ($zipname) was not created"; } return $result; }$zip = zipfiles('.');echo $zip;?>[/code]Here is the list of the files and folders in the directory[code]Array([dirs] => Array([0] => ./images[1] => ./includes[2] => ./includes/test)[files] => Array([0] => ./db.php[1] => ./functions.php[2] => ./includes/class.php[3] => ./includes/db.php[4] => ./includes/test/test.htm[5] => ./includes/zip.class.php[6] => ./index.php[7] => ./mail.php[8] => ./test.pdf[9] => ./test.php[10] => ./test.txt[11] => ./test2.php[12] => ./test2.txt[13] => ./test3.php[14] => ./test4.php[15] => ./test5.php[16] => ./test6.php[17] => ./whois.txt[18] => ./whois2.txt))[/code]Any suggestions on how I can add the folders, subfolders and all files as they are found.Thanks,Tom Quote Link to comment Share on other sites More sharing options...
tomfmason Posted September 5, 2006 Author Share Posted September 5, 2006 I sort of got it working. I am able to create a zip file with all of the files and directories in it. Here is the fixed code.[code]<?phpinclude_once("includes/zip.class.php");function listfiles($dir, $zipdir) { static $files = array(); static $dirs = array(); static $zipdirs = array(); static $zipfiles = array(); $handle = opendir($dir); while (($file = readdir($handle)) !== false) { if (!in_array($file, array('.', '..'))) { if (is_dir($path = ($dir . DIRECTORY_SEPARATOR . $file))) { $newdir = $zipdir . $file . "/"; $dirs[] = $path; $zipdirs[] = $newdir; listfiles($path, $newdir); } else { $newfile = $zipdir . $file; $files[] = "$path, $newfile"; } } } return array($zipdirs, $files);}$list = listfiles('.', '');list($zipdirs, $fs) = $list;$newzip = new createZip;foreach ($zipdirs as $zipdir) { $newzip -> addDirectory($zipdir);}foreach ($fs as $f) { list ($file, $zipfile) = explode(",", $f); $contents = file_get_contents($file); $newzip -> addFile($contents, $zipfile);}$zipname = "test.zip";$fp = fopen($zipname, "wb");$out = fwrite($fp, $newzip -> getZippedfile($zipname));fclose($fp);?>[/code]However, I am having an issue. When I have a directory that has a sub directory it is created twice. Like in the includes directory I have a sub folder called test. When I created the zipfile I had two includes directories. One had the files that were orginaly in the includes directory and the other was empty. Here is an example of what I mean.The folders before the zip1 images2 inludesand in side the zip1 images2 includes (the one with the files and sub directories)3 inludes (a empty copy of the first one)Any suggestion as to why this is happening or how I can search the zipfile and remove any empty duplicate directories?Thanks,Tom Quote Link to comment Share on other sites More sharing options...
tomfmason Posted September 5, 2006 Author Share Posted September 5, 2006 I tried adding this.[code=php:0]$list = listfiles('.', '');list($zipdirs, $fs) = $list;$newzip = new createZip;foreach ($zipdirs as $zipdir) { if (!in_array($zip_dir, $created)) { $newzip -> addDirectory($zipdir); $created[] = $zipdir; }}foreach ($fs as $f) { list ($file, $zipfile) = explode(",", $f); $contents = file_get_contents($file); $newzip -> addFile($contents, $zipfile);}$zipname = "test.zip";$fp = fopen($zipname, "wb");$out = fwrite($fp, $newzip -> getZippedfile($zipname));fclose($fp);[/code]this dosn't stop the dublicate file from being added. I also tried this piece of code to see if it was my zip class that is causeing the trouble[code]<?phpinclude_once("includes/zip.class.php");$newzip = new createZip;$newzip -> addDirectory('test/');$newzip -> addDirectory('test/test/');$newzip -> addDirectory('test/test/test/');$zipname = "test2.zip";$fp = fopen($zipname, "wb");$out = fwrite($fp $newzip -> getZippedfile($zipname));fclose($fp);?>[/code] This works fine. Each directory is created without a double entry. So this means that it is somewhere in the foreach loop. Any suggestions ??Thanks,Tom Quote Link to comment Share on other sites More sharing options...
tomfmason Posted September 5, 2006 Author Share Posted September 5, 2006 Anyone have any suggestions? I am beating my head against a wall on this one Quote Link to comment Share on other sites More sharing options...
tomfmason Posted September 6, 2006 Author Share Posted September 6, 2006 I figured out what the problem was. If I try to create a subdirectory it will create an empty directory. However, if I just create the files, the directories will be created as well. So all I have to do is this.[code=php:0]$list = listfiles('.', '');list($zipdirs, $fs) = $list;$newzip = new createZip;foreach ($fs as $f) { list ($file, $zipfile) = explode(",", $f); $contents = file_get_contents($file); $newzip -> addFile($contents, $zipfile);}$zipname = "test.zip";$fp = fopen($zipname, "wb");$out = fwrite($fp, $newzip -> getZippedfile($zipname));fclose($fp);[/code]This will create all of the directories and files. Unless a directory is empty. I will work on that. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.