ZipEntry引起的ENOENT (No such file or directory)
最近做一个功能,里面有解压缩的功能,遇到一个坑,报错如题目,记录分享出来供大家参考;
网上搜到的解压缩的代码基本就是这样的:
try {
File zipFile = new File(zipFilePath);
/**创建解压缩文件保存的路径*/
File unzipFileDir = new File(unzipFilePath);
if (!unzipFileDir.exists()){
unzipFileDir.mkdirs();
}
//开始解压
ZipEntry entry = null;
String entryFilePath = null;
int count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
ZipFile zip = new ZipFile(zipFile);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();
//循环对压缩包里的每一个文件进行解压
while(entries.hasMoreElements()){
entry = entries.nextElement();
/**这里提示如果当前元素是文件夹时,在目录中创建对应文件夹
* ,如果是文件,得出路径交给下一步处理*/
entryFilePath = unzipFilePath + File.separator + entry.getName();
File file = new File(entryFilePath);
if(entryFilePath.endsWith("/")){
if(!file.exists()){
file.mkdir();
}
continue;
}
/***这里即是上一步所说的下一步,负责文件的写入
bos = new BufferedOutputStream(new FileOutputStream(entryFilePath+"/"));
bis = new BufferedInputStream(zip.getInputStream(entry));
while ((count = bis.read(buffer, 0, bufferSize)) != -1){
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
AILog.d(TAG,"unzip end");
}
}catch (Exception e){
e.printStackTrace();
}
这里面有个坑,遇到这样的多级目录下的文件:
解压的c.text的时候就会报错;entry是每个实体文件的路径,如果含有多级目录文件,就会爆出 如题目的错误,然后百度错误,大部分是要加权限问题;但是这里的真正问题是,创建文件的时候,多级目录是new不出来的,解决办法如下,全部代码:
public static void unzip(String zipFilePath, String unzipFilePath) {
/**验证是否为空*/
if (TextUtils.isEmpty(zipFilePath) || TextUtils.isEmpty(unzipFilePath)) {
return;
}
try {
File zipFile = new File(zipFilePath);
/**创建解压缩文件保存的路径*/
File unzipFileDir = new File(unzipFilePath);
if (!unzipFileDir.exists()) {
File parent = unzipFileDir.getParentFile();
if (!parent.exists()) {
parent.mkdirs(); //创建所有父文件夹
}
unzipFileDir.mkdirs();
}
//开始解压
ZipEntry entry = null;
String entryFilePath = null;
int count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
ZipFile zip = new ZipFile(zipFile);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
//循环对压缩包里的每一个文件进行解压
while (entries.hasMoreElements()) {
entry = entries.nextElement();
String entryName = entry.getName();
String[] fileDirs = entryName.split("\\/");
if (fileDirs.length > 0) {
String topPath = unzipFilePath;
for (int i = 0; i < fileDirs.length-1; i++) {
topPath += "/" + fileDirs[i];
File file1 = new File(topPath);
AILog.d(TAG,"topPath:"+topPath);
if (file1.exists()) {
continue;
} else {
file1.mkdir();
}
}
}
/**这里提示如果当前元素是文件夹时,在目录中创建对应文件夹
* ,如果是文件,得出路径交给下一步处理*/
entryFilePath = unzipFilePath + File.separator + entry.getName();
File file = new File(entryFilePath);
AILog.d(TAG, "entryFilePath::" + entryFilePath);
if (entryFilePath.endsWith("/")) {
if (!file.exists()) {
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs(); //创建所有父文件夹
}
file.mkdir();
}
continue;
}
/***这里即是上一步所说的下一步,负责文件的写入,不服来咬(≖ ‿ ≖)✧*/
bos = new BufferedOutputStream(new FileOutputStream(entryFilePath + "/"));
bis = new BufferedInputStream(zip.getInputStream(entry));
while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
AILog.d(TAG, "unzip end");
copyFolder(unzipFilePath, "/ivres");
}
} catch (Exception e) {
AILog.d(TAG, e.getMessage() + "::" + e.getStackTrace() + "::" + e.getCause());
e.printStackTrace();
}
//解压完成后,删除压缩包文件(此处根据需要可进行删除)
File oldFile = new File(zipFilePath);
oldFile.delete();
deletePath(unzipFilePath);
AILog.d(TAG,"unzip and copy success");
}
核心代码是这里:
循环创建分级目录文件夹。
如果你也遇到相同问题,拿去不谢,可以点赞收藏一下。转载请注明出处,谢谢!