package com.mandi.servlet.file.impl;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Enumeration;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;


import com.mandi.servlet.file.Zipfile;

/** 
 * @author mengly 
 * @version 创建时间:2015年11月6日 下午7:00:20 
 * 类说明 
 */

public class Zipfileimpl implements Zipfile {
    private int buffersize=1024;
	@Override
	public File zip(String path,String dest) {
		File sf=new File(path);
		if(!sf.exists())
			return null;
		this.zip(sf, dest);
		return null;
	}
	private void compress(File f,ZipOutputStream zos,String pathbase)
	{
		if(f.isDirectory())
		{
			File[] files = f.listFiles();
			if(files.length<1)
			{
				ZipEntry ze=new ZipEntry(pathbase + f.getName()+ File.separator);
				try {
					zos.putNextEntry(ze);
					zos.closeEntry();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}else{
				for (File file : files) {
					compress(file, zos,f.getName()+ File.separator);
				}
			}
		}else if(f.isFile()){
			ZipEntry ze=new ZipEntry(pathbase + f.getName());
			BufferedInputStream bis=null;
			try {
				zos.putNextEntry(ze);
				int count;
				bis=new BufferedInputStream(new FileInputStream(f));
				byte data[]=new byte[buffersize];
				while((count=bis.read(data, 0, buffersize))!=-1)
				{
					zos.write(data,0,count);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				try {
					bis.close();
					zos.closeEntry();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}

	@Override
	public File zip(File file,String dest) {
		if(!file.exists())
			return null;
		ZipOutputStream zos=null;
		try {
			File df=new File(dest);
			CheckedOutputStream cos=new CheckedOutputStream(new FileOutputStream(df), new CRC32());
			zos=new ZipOutputStream(cos);
			if(file.isFile())
				compress(file,zos,"");
			else{
				File[] fs=file.listFiles();
				for (File file2 : fs) {
					compress(file2,zos,"");
				}
			}
			return df;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally{
			try {
				zos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	@Override
	public File unzip(String path,String dest) {
		File f=new File(path);
		if(!f.exists())
			return null;
		this.unzip(f, dest);
		return null;
	}

	@Override
	public File unzip(File file,String dest) {
		File destfile=new File(dest);
		if(!destfile.exists()||!destfile.isDirectory())
			destfile.mkdirs();
		if(!dest.endsWith(File.separator))
		{
			dest=dest+File.separator;
		}
		ZipFile zf=null;
		try{
			zf=new ZipFile(file,Charset.forName(System.getProperty("sun.jnu.encoding")));
			Enumeration<ZipEntry> enums=(Enumeration<ZipEntry>) zf.entries();
			while(enums.hasMoreElements())
			{
				ZipEntry zee=enums.nextElement();
				if(zee.isDirectory())
				{
					String entryname=zee.getName();
					String tempname=dest+entryname.substring(0,entryname.length()-1);
					File f = new File(tempname);
					if (!f.exists()||!f.isDirectory())
						f.mkdirs();
				}else{
					Files.copy(zf.getInputStream(zee), Paths.get(dest+zee.getName()));
				}
			}
			
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				zf.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return null;
	}

}