2011-02-04 9 views
41

En mi solicitud, cuando navegamos el archivo de sdcard del fichero será .text, archivo de vídeo .jpg y mpeg4ie. Quiero almacenar cada tipo de archivo en una carpeta particular. Por ejemplo, los archivos .text van a la carpeta de texto. Mi pregunta es cuando selecciono el archivo, ¿cómo reviso la extensión del archivo?Cómo comprobar extensión de archivo en Android

Respuesta

63

me gustaría tener el nombre del archivo como una cadena, dividirlo en una matriz con "" como el delimitador, y luego obtener el último índice de la matriz, que sería la extensión del archivo. Por ejemplo:

public class main { 
    public static void main(String[] args) { 
     String filename = "image.jpg"; 
     String filenameArray[] = filename.split("\\."); 
     String extension = filenameArray[filenameArray.length-1]; 
     System.out.println(extension); 
    } 
} 

que da salida:

jpg 
+41

suponiendo que existe una extensión, prefiero usar filename.substring (filename.lastIndexOf ('.') + 1) para obtener la extensión. Usar expresión regular para algo tan simple como este es exagerado (y es más lento). –

+4

rrrrrray, ya sabes lo que dicen sobre asumir ... –

+5

El punto que estoy tratando de transmitir es el de no usar la expresión regular para una tarea simple como esta, no la comprobación de errores. –

2

no han tenido la oportunidad de ejecutar este (por lo que podrían no funcionar al 100%), pero debería ser lo que estás buscando:

File files[] = Environment.getExternalStorageDirectory().listFiles(); 
for (File f : files) 
{ 
    String fullPath = f.getAbsolutePath(); 
    int dot = fullPath.lastIndexOf("."); 
    String ext = fullPath.substring(dot + 1); 
    if(ext.equalsIgnoreCase("txt")) // make sure case is irrelevant for your use case; otherwise use ext.equals("txt") 
    { 
    //do something with f here 
    } 
} 
+0

Gracias Mike y Brenden, –

+1

'if (ext.equals (txt))' en lugar de 'if (ext == "txt")' – IHeartAndroid

+0

@IHeartAndroid actualizado, gracias! – brendan

4

también podría hacer algo como el endswith a continuación y uso.

public void walkdir(File dir) { 
    String txtPattern = ".txt"; 
    String jpgPattern = ".jpg"; 
    String mp3Pattern = ".mp3"; 

    File listFile[] = dir.listFiles(); 

    if (listFile != null) { 
     for (int i = 0; i < listFile.length; i++) { 

      if (listFile[i].isDirectory()) { 
       walkdir(listFile[i]); 
      } else { 
       if (listFile[i].getName().endsWith(txtPattern)){ 
            //put in txt folder 
           }else if (listFile[i].getName().endsWith(jpgPattern.toLowerCase())){ 
            // put in jpg folder 
           }else if (istFile[i].getName().endsWith(mp3Pattern.toLowerCase())) { 
            // put in mp3 folder 
       } 
      } 
     } 
    } 

} 

Lo sentimos, no hemos comprobado el trabajo, pero debería hacerlo por usted.

+0

+1. ¿Por qué todos los demás tienen que usar algo aparte de esto? – josephus

+1

Extensiones sensibles a mayúsculas y minúsculas? ¿Qué pasa con los archivos llamados readme.TXT etc. – Diederik

18

o usted podría hacer

MimeTypeMap.getFileExtensionFromUrl(myfile.toURL().toString()); 

Nota: este método no es muy fiable, aunque ..

+2

como File # toURL() está en desuso? Esto debe ser myfile.toURI(). ToURL(). ToString() – Somatik

+0

Esto no admite el nombre de archivo unicode. –

45
public static String getFileExt(String fileName) {  
    return fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()); 
} 
+1

¿Puedes explicar la parte +1? – RoCk

+4

@RoCK Sin el +1, sería, por ejemplo, ".jpg" en lugar de "jpg". Tenga en cuenta el punto. – newfivefour

+0

Se puede simplificar como fileName.substring (fileName.lastIndexOf (".") + 1). – rzaaeeff

0

Si desea obtener todos los archivos que tienen extensiones específicas de una determinada directorio:

File[] files = (new File("/sdcard/yourDirectory/").listFiles(new CustomFilter()); 

.... 


class CustomFilter implements FileFilter 
    { 
//Add the file extensions you want to look for here: 
     private String[] extension = 
             { "text", "jpg", "jpeg", "mpeg" }; 

     @Override 
     public boolean accept(File pathname) 
     { 
      String name = pathname.getName().toLowerCase(); 

      for (String anExt : extension) 
      { 

       if (name.endsWith(anExt)) 
       { 
// A file has been detected with that extension 
        return true; 

       } 
      } 
      return false; 
     } 

    } 
1

he encontrado buen ejemplo a docs.oracle.com cómo conseguir extensión de archivo que retu extensión del tipo de archivo de RN en minúsculas o null si no hay archivo de extensión:

/* 
    * Get the extension of a file. 
    */ 
    public static String getExtension(File f) { 
     String ext = null; 
     String s = f.getName(); 
     int i = s.lastIndexOf('.'); 

     if (i > 0 && i < s.length() - 1) { 
      ext = s.substring(i + 1).toLowerCase(); 
     } 
     return ext; 
    } 
2

Esto funciona para mí: se devuelve

public static String getExtension(String fileName) { 
    String encoded; 
    try { encoded = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"); } 
    catch(UnsupportedEncodingException e) { encoded = fileName; } 
    return MimeTypeMap.getFileExtensionFromUrl(encoded).toLowerCase(); 
} 

Cuando el archivo es /mnt/sdcard/boomerang/2013-06-18_12:08:53.txt, "txt".

Tenga en cuenta que las llamadas URLEncoder.encode y .repalce deben solucionar los problemas de fiabilidad que pueda ver cuando se llama al MimeTypeMap.getFileExtensionFromUrl. Por ejemplo, sin la codificación y reemplazar las llamadas, nombres de archivo como "Test Image!.jpg" devuelven cadenas vacías. También asegúrese de que el nombre del archivo esté en minúscula. Es MimeTypeMap no parece tener entradas para .PNG o .JPG.

+0

'String ext =" ", fileName = file.getName(). ToLowerCase(); try {ext = MimeTypeMap.getFileExtensionFromUrl (fileName); } catch (Exception e) {e.printStackTrace(); } 'funcionó para mí. – zanky

+0

@zanky Eso sí funciona muchas veces, pero hay casos (no recuerdo cuáles exactamente, han pasado varios meses) en los que falla inesperadamente. En mi experiencia, al llamar 'Uri.encode' en el nombre del archivo condujo el caso de falla a cero. – Xavi

+0

@Xavi ... ya, puede que tengas razón, pero en mi caso cuando usé 'Uri.Encode', volvía a codificar la extensión del archivo que tenía un formato algo así' 3gp% 4a% 5D ... 'así que eliminado el método codificar(). – zanky

0
public String getExtension(File file) { 
     String fileName = file.getName(); 
     try { 
      if (fileName.contains("\\.")) { 
       String filenameArray[] = fileName.split("\\."); 
       extension = filenameArray[filenameArray.length - 1]; 
      } else { 
       extension = "dir"; 
      } 
     } catch (Exception e) { 
      extension = "err"; 
     } 
     return extension; 
    } 
1

El camino más corto para averiguar la extensión de archivo es el uso de lastIndexOf('.') suponiendo que el nombre de archivo contiene extensión.Compruebe el siguiente código

String fileName = "test.jpg"; 
int i = fileName.lastIndexOf('.'); 
String fileExtension = fileName.substring(i+1); 
Log.v("FILE EXTENSION: ",fileExtension); 
14

Puede utilizar FilenameUtils de Apache Commons:

String extension = FilenameUtils.getExtension(mFile.getName()); 
0

Aquí es un método que sirve para probar todos los casos

String getExtension(String fileName){ 
     final String emptyExtension = ""; 
     if(fileName == null){ 
      return emptyExtension; 
     } 
     int index = fileName.lastIndexOf("."); 
     if(index == -1){ 
      return emptyExtension; 
     } 
     return fileName.substring(index + 1); 
    } 
0

material es .endsWith ("su extensión")

String whatever = you String; 

if(whatever.endsWith("jpg")){ 
    // your jpg code 
}else if(whatever.endsWith("png")){ 
// your png code 
} 
Cuestiones relacionadas