我的代码将目录检测为文件和文件作为目录。它为什么这样做?感谢
我已经攻击了问题发生的全部功能,对不起,如果它很乱!再次感谢您的帮助!
unzip(getFilesDir() + "/", "bla.zip", getFilesDir() + "/unzip/");
public void unzip(String filepath, String filename, String unzip_path) {
try {
InputStream is = new FileInputStream(filepath + filename);
Log.d("1st", filepath + filename);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
try {
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
String filename_temp = ze.getName();
File fmd = new File(unzip_path, filename_temp);
Log.d("2nd", unzip_path + filename_temp);
Log.d("ERROR7", fmd.toString());
//if (!fmd.exists()) {
if(fmd.isDirectory()) {
Log.d("ERROR4", fmd.toString());
fmd.mkdirs();
} else if (fmd.isFile()) {
Log.d("ERROR4", fmd.toString() +"FILE");
}
//} else {}
Log.d("ERROR5", "DIR");
FileOutputStream fout = new FileOutputStream(unzip_path + filename_temp);
Log.d("ERROR6", "DIR");
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
byte[] bytes = baos.toByteArray();
fout.write(bytes);
baos.reset();
}
fout.close();
//}
}
zis.close();
} catch (IOException e) {
Log.d("ERROR1", e.toString());
}} catch (FileNotFoundException e) { Log.d("ERROR2", e.toString());}
}
1st﹕ /data/data/au.com.amon/files/bla.zip
2nd﹕ /data/data/au.com.amon/files/unzip/docProps/
ERROR7﹕ /data/data/au.com.amon/files/unzip/docProps
ERROR4﹕ /data/data/au.com.amon/files/unzip/docPropsFILE
ERROR5﹕ DIR
ERROR6﹕ DIR
2nd﹕ /data/data/au.com.amon/files/unzip/docProps/app.xml
ERROR7﹕ /data/data/au.com.amon/files/unzip/docProps/app.xml
ERROR5﹕ DIR
ERROR1﹕ java.io.FileNotFoundException: /data/data/au.com.amon/files/unzip/docProps/app.xml: open failed: ENOTDIR (Not a directory)
DOCUMENT﹕ docProps
答案 0 :(得分:2)
您的代码没有意义。从ZIP文件中读取的文件名称并不一定代表磁盘上已存在的文件,也不构成File
构造的文件。因此,在其上测试isDirectory()
是徒劳的,并且测试它是否应该调用mkdirs()
更加徒劳无功。如果是目录,则不应该致电mkdirs()
。
要检查的内容是ZipEntry.isDirectory().
答案 1 :(得分:0)
尝试以下方法:
File fmd = new File(getFilesDir() + "/unzip/", filename_temp);
您使用的是单字符串arg构造函数,它表示路径名,而不是文件名。