我试图解压缩一个压缩文件(该文件包含许多子文件夹和文件)。Uzip文件夹递归-android
I am not able to create sub-folders while unzipping the file.
每次我收到一个错误说:
No such file or directory.
我已经搜索了很多关于此类似:
- Android - Unzip a folder?
- http://www.roseindia.net/tutorial/java/corejava/zip/ZipIsDirectory.html
- Unzip a zipped file on sd card in Android application
- How to unzip files recursively in Java?
但是,没有什么帮助我。
下面是我曾尝试:
public class UnZipper {
private static final String TAG = "UnZip";
private String mFileName, mDestinationPath;
public UnZipper(String fileName, String destinationPath) {
mFileName = fileName;
mDestinationPath = destinationPath;
}
public String getFileName() {
return mFileName;
}
public String getDestinationPath() {
return mDestinationPath;
}
// shrikant
public void unzip() {
String fullPath = mFileName;
Log.d(TAG, "unzipping " + mFileName + " to " + mDestinationPath);
doInBackground(fullPath, mDestinationPath);
}
// shrikant: I have changed return type from Boolean to boolean.
protected boolean doInBackground(String filePath, String destinationPath) {
File archive = new File(filePath);
boolean returnValue = false;
try {
ZipFile zipfile = new ZipFile(archive);
for (Enumeration e = zipfile.entries(); e.hasMoreElements();) {
ZipEntry entry = (ZipEntry) e.nextElement();
try {
unzipEntry(zipfile, entry, destinationPath);
Log.d("Unzipped", entry.getName());
returnValue = true;
} catch (Exception ex) {
Log.e(TAG,
"Error while extracting file: " + entry
+ ex.getMessage());
}
}
} catch (Exception e) {
Log.e(TAG, "Error while extracting file " + archive, e);
// return false;
}
return returnValue;
}
// shrikant: I have changed return type from void to boolean.
/**
* Unzips the zipped file into outputDir path.
*
* @param zipfile
* @param entry
* @param outputDir
* @throws IOException
*/
private void unzipEntry(ZipFile zipfile, ZipEntry entry, String outputDir)
throws IOException {
Log.d("CURRENT ZIP", entry.getName());
String _dir = null, fileName = null;
if (entry.getName().contains("\\")) {
_dir = entry.getName().substring(0, entry.getName().indexOf('\\'));
createDir(new File(outputDir, _dir));
fileName = entry.getName().substring(entry.getName().indexOf('\\'));
}
// Change by Prashant : To Remove "/" from file Name Date : 5/01/2011
if (fileName.toString().startsWith("\\")) {
fileName = fileName.substring(1); // End
}
if (_dir != "")
outputDir = outputDir + "/" + _dir;
File outputFile = new File(outputDir, fileName);
if (!outputFile.getParentFile().exists()) {
createDir(outputFile.getParentFile());
}
Log.d("OUTPUT FILE", outputDir + fileName);
Log.v(TAG, "Extracting: " + entry);
Log.d("FOUND inside unzipEntry()", entry.getName());
BufferedInputStream inputStream = new BufferedInputStream(
zipfile.getInputStream(entry));
// **here I am getting error.**
BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream(outputFile));
// **above line.**
try {
copy(inputStream, outputStream);
} finally {
outputStream.close();
inputStream.close();
}
}
private void createDir(File dir) {
if (dir.exists()) {
return;
}
Log.v(TAG, "Creating dir " + dir.getName());
if (!dir.mkdirs()) {
throw new RuntimeException("Cannot create dir " + dir);
}
}
private void copy(BufferedInputStream input, BufferedOutputStream output)
throws IOException {
byte[] buffer = new byte[4096];
int size;
while ((size = input.read(buffer)) != -1)
output.write(buffer, 0, size);
}
}
我的问题是:(请看代码)
当我打电话unzipEntry()
,当它遇到的子文件夹,它通过类似“/data/abc.ext
”的东西,但我的文件系统不包含名为“数据”的任何文件夹,我甚至试图创建它,但未能这样做。
那么如何创建从压缩文件到目标路径的子文件夹?
我甚至试过的方法:
if(entry.isDirectory) {
// create directory
}
但是,这不会被调用,因为unzipEntry()
(请看在for() loop
)直接通过下子文件夹中的文件。
请帮我解决这个问题。
谢谢。
您是否有权限在清单中写入SDcard集? –
mDestinationPath的价值是什么? – njzk2
mDestinationPath包含将保存解压缩文件的文件路径。 – Shrikant