Pastas do Uzip recursivamente -android
Eu tentei descompactar um arquivo zipado (este arquivo contém muitas subpastas e arquivos).
I am not able to create sub-folders while unzipping the file.
Cada vez que recebo um erro dizendo:
No such file or directory.
Eu pesquisei muito sobre isso como:
Android - Descompacte uma pasta?http://www.roseindia.net/tutorial/java/corejava/zip/ZipIsDirectory.htmlDescompacte um arquivo zipado no cartão SD no aplicativo AndroidComo descompactar arquivos recursivamente em Java?Mas nada me ajudou.
A seguir é o que eu tentei:
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);
}
}
Minha pergunta é: (Por favor, olhe o código)
Quando eu estou chamandounzipEntry()
, quando encontra uma subpasta, passa algo como "/data/abc.ext
", mas meu sistema de arquivos não contém nenhuma pasta chamada"dados", Eu até tentei criá-lo, mas falhei em fazê-lo.
Então, como criar sub-pastas de arquivo zipado para o caminho de destino?
Eu até tentei método:
if(entry.isDirectory) {
// create directory
}
Mas isso não é chamado, já queunzipEntry()
(Por favor, procurefor() loop
) passa diretamente o arquivo em subpasta.
Por favor me ajude nisso.
Obrigado.