/** * Nem tilgang til at zippe nogle filer, samt unzippe dem. * * @author Bluetone * @version 1.0 */ public class ZipManager { static final int BUFFER = 2048;
public static boolean zipFiles(File[] files, File zipFile) { if (files.length < 1) return false; try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(zipFile); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); //out.setMethod(ZipOutputStream.DEFLATED); byte data[] = new byte[BUFFER];
for (int i = 0; i < files.length; i++) { // Metoden kan i øjeblikket ikke håndtere directories... if (!files[i].isDirectory()) { FileInputStream fi = new FileInputStream(files[i]); origin = new BufferedInputStream(fi, BUFFER); ZipEntry entry = new ZipEntry(files[i].getName()); out.putNextEntry(entry); int count; while ( (count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); } } out.flush(); out.close();
public static boolean unZip(File zipFile, File path) { try { BufferedOutputStream dest = null; BufferedInputStream is = null; ZipEntry entry; ZipFile zipfile = new ZipFile(zipFile); Enumeration e = zipfile.entries();
while (e.hasMoreElements()) { entry = (ZipEntry) e.nextElement(); System.out.println("Extracting: " + entry); is = new BufferedInputStream(zipfile.getInputStream(entry)); int count; byte data[] = new byte[BUFFER];
if (!path.exists()) path.mkdir();
String p = path.getAbsolutePath(); if (!p.endsWith("\\")) p += "\\";
FileOutputStream fos = new FileOutputStream(p + entry.getName()); dest = new BufferedOutputStream(fos, BUFFER);
Hej Der er vist lidt knas i "p + entry.getName()" Jeg unzipper filen curDir.zip til c:\temp\testen333 ( se linien zipmanager.unZip(new File("curDir.zip"),new File("c:\\temp\\testen333)")); ) og får fejlen:
Extracting: c:\temp\zip\COPYING c:\temp\hesten333)\c:\temp\zip\COPYING java.io.FileNotFoundException: c:\temp\testen333)\c:\temp\zip\COPYING (Syntaksen i filnavnet, mappen eller diskenhedsnavnet er forkert) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at ZipManager.unZip(ZipManager.java:41) at ZipManager.main(ZipManager.java:138)
Hej Jeg har rettet i klassen (så den hedder UnZip).
Jeg har en eksisterende zipfil aaa.zip i c:\temp - den vil jeg gerne pakke ud. Og jeg vil gerne pakke den ud i c:\temp\nydir. Dvs jeg vil have c:\temp\nydir fyldt med filer og kataloger fra zip-filen aaa.zip.
Jeg anvender: File zipfil = new File("c:\\temp\\aaa.zip"); File dir = new File("c:\\temp\nydir");
Måske bruges programmet på en anden måde ?
Jeg får output og fejlen: Extracting: mimetype c:\temp\nydir\mimetype Extracting: Configurations2/ c:\temp\nydir\Configurations2/ Extracting: content.xml c:\temp\nydir\content.xml Extracting: styles.xml c:\temp\nydir\styles.xml Extracting: meta.xml c:\temp\nydir\meta.xml Extracting: Thumbnails/thumbnail.png c:\temp\nydir\Thumbnails/thumbnail.png java.io.FileNotFoundException: c:\temp\nydir\Thumbnails\thumbnail.png (Den angiv ne sti blev ikke fundet) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at UnZip.unZip(UnZip.java:53) at UnZip.main(UnZip.java:18)
Her er programmet lettere modificeret: public class UnZip{
public static void main(String[] a) { UnZip u = new UnZip(); File zipfil = new File("c:/temp//aaa.zip"); File dir = new File("c:/temp//nydir"); u.unZip(zipfil,dir); }
static final int BUFFER = 2048;
public static boolean unZip(File zipFile, File path) { try { BufferedOutputStream dest = null; BufferedInputStream is = null; ZipEntry entry; ZipFile zipfile = new ZipFile(zipFile); Enumeration e = zipfile.entries();
while (e.hasMoreElements()) { entry = (ZipEntry) e.nextElement(); System.out.println("Extracting: " + entry); is = new BufferedInputStream(zipfile.getInputStream(entry)); int count; byte data[] = new byte[BUFFER];
if (!path.exists()) path.mkdir();
String p = path.getAbsolutePath(); if (!p.endsWith("\\")) p += "\\";
System.out.println(p + entry.getName());
FileOutputStream fos = new FileOutputStream(p + entry.getName()); dest = new BufferedOutputStream(fos, BUFFER);
Har lige siddet og leget lidt med den her, ved ikke om det lige er det, men jeg synes nedenstående stort set fungerer a la WinZip - eller hva ?????
public class NewMain { public NewMain() { }
public static void main(String[] args) { File[] f = new File[]{new File("C:\\DIR_HVORFRA_FILER_SKAL_ZIPPES\\")}; File zip = new File("C:\\ZIP.zip"); ZipManager.zipFiles(f, zip);
ZipManager.unZipFiles(zip, new File("C:\\test\\udpak\\")); } }
private static String findBase(File[] file){ String f = "", base = ""; String separator = System.getProperty("file.separator");
int index = -1; int oldIndex = 10000;
for (int i = 0; i < file.length; i++) { f = file[i].getPath(); index = f.lastIndexOf( separator ); if(index < oldIndex && index >= 0){ oldIndex = index; base = f.substring(0, f.length()); } }
if(!base.endsWith( separator )) base += separator;
For lige at hive en gammel tråd op, så har jeg forsøgt mig med _carstens eksempel fra 06/02 og den vil - desværre - ikke udpakke en zip fil hvis der er dirs inden i, hvad kan være galt ?
Extract to base: N:\testWin\ file: app_test/app_test/ java.io.FileNotFoundException: N:\testWin\app_test\app_test (The system cannot find the path specified) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at ziptest.ZipHelper.unZipFiles(ZipHelper.java:90) at ziptest.UnpackTester.main(UnpackTester.java:22)
public static boolean unZipFiles(File zipFile, File unZipToPath) { try { String separator = System.getProperty("file.separator"); BufferedOutputStream dest = null; BufferedInputStream is = null; ZipEntry entry; ZipFile zipfile = new ZipFile(zipFile); Enumeration e = zipfile.entries();
if (!unZipToPath.exists()) unZipToPath.mkdirs();
while (e.hasMoreElements()) { File f; entry = (ZipEntry) e.nextElement();
if(entry.isDirectory()){ new File(unZipToPath + separator + entry.toString()).mkdir(); } else{ is = new BufferedInputStream(zipfile.getInputStream(entry)); int count; byte data[] = new byte[BUFFER];
FileOutputStream fos = new FileOutputStream(unZipToPath + separator + entry.getName()); dest = new BufferedOutputStream(fos, BUFFER);
For det første tak for det hurtige svar! Men den virker stadig ikke helt, den vil stadig kun pakke zip filer ud som indeholder filer, hvis en zip indeholder dirs får jeg enten bare en FileNotFoundException eller den eksekverer færdig og jeg får et tomt dir.
Ydermere får jeg en Warning(74,14): variable f declared but never read (i while(e.hasMoreElements())
java.io.FileNotFoundException: N:\aupod\app_test\build.xml (The system cannot find the path specified) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at ziptest.ZipHelper.unZipFiles(ZipHelper.java:96) at ziptest.UnpackTester.main(UnpackTester.java:32) Process exited with exit code 0.
Du har ret, det er FileOutputStream som fejler hvis der mangler et dir!
Så tror jeg vi er der med denne
public static boolean unZipFiles(File zipFile, File unZipToPath) { try { String separator = System.getProperty("file.separator"); BufferedOutputStream dest = null; BufferedInputStream is = null; ZipEntry entry; ZipFile zipfile = new ZipFile(zipFile); Enumeration e = zipfile.entries();
if (!unZipToPath.exists()) unZipToPath.mkdirs();
while (e.hasMoreElements()) { entry = (ZipEntry) e.nextElement();
if(entry.isDirectory()){ File f = new File(unZipToPath + separator + entry.toString()); if( !f.exists()) f.mkdir(); } else{ int x = entry.toString().lastIndexOf("/");
if(x > 0 ){ String p = unZipToPath + separator + entry.toString().substring(0,x); File f = new File( p ); if( !f.exists()) f.mkdir(); }
is = new BufferedInputStream(zipfile.getInputStream(entry)); int count; byte data[] = new byte[BUFFER];
Det ser ud som om det det funker nu! jeg bukker og takker mange gange!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.