public boolean dump(String key){
		File f = new File(this.cache + "/" + Extends.getPid() + "/" + key);	

		String md5File = f.getAbsolutePath() + Constants.MD5_SUFFIX;
		if (new File(md5File).exists() && !FS.read(md5File).equals(calMd5(f.getAbsolutePath()))) {
			return false;
		}
		
		String prefix = key.substring(0,key.lastIndexOf("/"));
		HashMap<String, String> tree = this.zkCtl.getTree(key);
		
		String tmpPath = f.getParent() + "_tmp";
		
		Iterator<String> i = tree.keySet().iterator();
		while (i.hasNext()) {
			String k = i.next().toString();
			String v = tree.get(k);
			FS.dump(this.addPath(tmpPath, k.substring(prefix.length())) + Constants.FILE_SUFFIX, v);
		}
		
		File file2 = new File(f.getParent());
		if (file2.exists()) {
			File[] files = file2.listFiles();
			for(int j = 0; j < files.length; j++){
				if (!files[j].getName().equals(f.getName()) && !files[j].getName().equals(f.getName() + Constants.FILE_SUFFIX)) {
					try {
						FS.cp(files[j].getAbsolutePath(), tmpPath + "/" + files[j].getName());
					} catch (IOException e) {
						this.emitEvent(Constants.GLOBAL_PREFIX, Constants.DUMP_ERROR_EVENT, key);
						e.printStackTrace();
					}
				}
			}
		}

		FS.dump(tmpPath + "/" + f.getName() + Constants.MD5_SUFFIX, this.calMd5(tmpPath + "/" + f.getName()));
		
		FS.rmdir(f.getParent());
		File oldFile = new File(tmpPath);
		File newFile = new File(f.getParent());
		oldFile.renameTo(newFile);
		return true;
	}