Android Saber si un archivo es un archivo (.jpg, etc.) o una carpeta Y comprimir un archivo (.png, etc.) y una carpeta

Actualmente estoy creando un programa que comprime un archivo usando el paquete java.util.zip. Funciona bien, pero noté que comprimir una carpeta/directorio es diferente de comprimir un archivo (corrígeme si me equivoco). En mi programa, tengo que saber si un archivo seleccionado es una carpeta o un archivo (como .jpg, .png, .apk, etc.). Probé algunos experimentos para poder saber y aquí está el código de muestra en mi actividad de selección de archivos: (currentDir es un archivo)

    if(currentDir.isDirectory())Toast.makeText(this,"Directory",Toast.LENGTH_LONG).show();
    if(currentDir.isFile())Toast.makeText(this, "File", Toast.LENGTH_LONG).show();

Después de insertar esto, cada archivo que elegí en mi actividad genera un "Directorio" y no un "Archivo", aunque elegí una imagen. ¿Puede alguien ayudarme a saber si un archivo en Android es una carpeta o no? ¡Gracias! (primer problema)

Y como dije anteriormente, noté que comprimir una carpeta es diferente a comprimir un archivo (corregir/enseñarme si me equivoco). Ya terminé cuando se trata de comprimir una carpeta, pero cuando se trata de comprimir un archivo, como imágenes, etc., todavía comprime el directorio, pero creo que DEBE comprimir solo el archivo que he elegido. aquí está mi código de muestra. (Segundo Problema)

public void onClick(View v) {
    try{
        ZipOutputStream zos = new ZipOutputStream( new FileOutputStream(new File(currentDir.getPath()+".zip")) );
        zip( currentDir, currentDir, zos );
        zos.close();    
        Toast.makeText(this, "File successfully compressed!", Toast.LENGTH_LONG).show();
    }catch (IOException e) {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();}
}

private static final void zip(File directory, File base,ZipOutputStream zos) throws IOException {
    File[] files = directory.listFiles();
    byte[] buffer = new byte[8192];
    int read = 0;
    for (int i = 0, n = files.length; i < n; i++) {
      if (files[i].isDirectory()) {
        zip(files[i], base, zos);
      } else {
        FileInputStream in = new FileInputStream(files[i]);
        ZipEntry entry = new ZipEntry(files[i].getPath().substring(base.getPath().length() + 1));
        zos.putNextEntry(entry);
        while (-1 != (read = in.read(buffer))) {
          zos.write(buffer, 0, read);
        }
        in.close();
      }
    }
  }

¡Cualquier comentario, ayuda, sugerencia, reacción es necesario y será apreciado! ¡Gracias!

preguntado el 22 de mayo de 12 a las 12:05

1 Respuestas

public void createZipFile(String path) {
        File dir = new File(path);
        String[] list = dir.list();
        String name = path.substring(path.lastIndexOf("/"), path.length());
        String _path;

        if(!dir.canRead() || !dir.canWrite())
            return;

        int len = list.length;

        if(path.charAt(path.length() -1) != '/')
            _path = path + "/";
        else
            _path = path;

        try {
            ZipOutputStream zip_out = new ZipOutputStream(
                                      new BufferedOutputStream(
                                      new FileOutputStream(_path + name + ".zip"), BUFFER));

            for (int i = 0; i < len; i++)
                zip_folder(new File(_path + list[i]), zip_out);

            zip_out.close();

        } catch (FileNotFoundException e) {
            Log.e("File not found", e.getMessage());

        } catch (IOException e) {
            Log.e("IOException", e.getMessage());
        }
    }

prueba con este código.

contestado el 22 de mayo de 12 a las 13:05

¡Gracias por la sugerencia! Actualmente estoy probando este código. Pero no sé cómo declaraste 'BUFFER' y falta el método 'zip_folder'. ¿También lo proporcionarás? Muchas gracias. - John

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.