Batí
soy un novato Tengo un EditText y un botón Examinar para explorar carpetas y seleccionar archivos solamente. Desde el botón Examinar, cuando se hace clic en un archivo, almacena la ruta de la carpeta en la que se encuentra ese archivo en una cadena y el nombre del archivo sin extensión en otra cadena, que estoy usando para almacenar, cualquiera de estos dos, en EditText.
Quiero hacer que el nombre del archivo tenga exactamente la extensión del archivo (ya sea uno o dos puntos), pero no tengo idea de cómo obtener la extensión del archivo también.
Todas las respuestas serán apreciadas.
Selector de archivos.java
package com.threefriends.filecrypto;
/**
* Created by hp on 01-06-2016.
*/
import java.io.File;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.text.DateFormat;
import android.os.Bundle;
import android.app.ListActivity;
import android.content.Intent;
import android.view.View;
import android.widget.ListView;
public class FileChooser extends ListActivity {
private File currentDir;
private FileArrayAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
currentDir=new File("/sdcard/");
fill(currentDir);
}
private void fill(File f)
{
File[]dirs=f.listFiles();
this.setTitle("Current Dir: "+f.getName());
List<Item>dir=new ArrayList<Item>();
List<Item>fls=new ArrayList<Item>();
try{
for(File ff: dirs)
{
Date lastModDate=new Date(ff.lastModified());
DateFormat formater=DateFormat.getDateTimeInstance();
String date_modify=formater.format(lastModDate);
if(ff.isDirectory()){
File[] fbuf=ff.listFiles();
int buf=0;
if(fbuf != null){
buf=fbuf.length;
}
else
buf=0;
String num_item=String.valueOf(buf);
if(buf == 0)
num_item=num_item+" item";
else
num_item = num_item+" items";
//String formated = lastModDate.toString();
dir.add(new Item(ff.getName(), num_item, date_modify, ff.getAbsolutePath(), "directory_icon"));
}
else
{
fls.add(new Item(ff.getName(), ff.length()+" Byte", date_modify, ff.getAbsolutePath(), "file_icon"));
}
}
}catch(Exception e)
{
}
Collections.sort(dir);
Collections.sort(fls);
dir.addAll(fls);
if(!f.getName().equalsIgnoreCase("sdcard"))
dir.add(0, new Item("..", "Parent Directory", "", f.getParent(), "directory_up"));
adapter=new FileArrayAdapter(FileChooser.this, R.layout.file_view, dir);
this.setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id){
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Item o = adapter.getItem(position);
if(o.getImage().equalsIgnoreCase("directory_icon") || o.getImage().equalsIgnoreCase("directory_up")){
currentDir=new File(o.getPath());
fill(currentDir);
}
else
{
onFileClick(o);
}
}
private void onFileClick(Item o)
{
//Toast.makeText(this, "Folder Clicked: "+ currentDir, Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.putExtra("GetPath", currentDir.toString());
intent.putExtra("GetFileName", o.getName());
setResult(RESULT_OK, intent);
finish();
}
}
Parte de MainActivity.java
//Defined for file edittext.
EditText editText2;
private static String TAG = MainFragment.class.getSimpleName(); //For File Exploring.
private static final int REQUEST_PATH = 1;
String curFileName;
String filePath;
EditText edittext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_main, container, false);
edittext = (EditText) view.findViewById(R.id.editText); //Done for File Exploring, EditText, Browse Button.
Button b1 = (Button) view.findViewById(R.id.skipButton);
b1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent1 = new Intent(v.getContext(), FileChooser.class);
startActivityForResult(intent1, REQUEST_PATH);
}
}
);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// See which child activity is calling us back.
if (requestCode == REQUEST_PATH)
{
if (resultCode == Activity.RESULT_OK)
{
curFileName = data.getStringExtra("GetFileName");
filePath=data.getStringExtra("GetPath");
edittext.setText(filePath);
}
}
}
muchas maneras aquí hay 2 muestras-
String someFilepath = "image.fromyesterday.test.jpg";
String extension = someFilepath.substring(someFilepath.lastIndexOf("."));
Así que en tu caso, debería ser algo así.
String extension = ff.getAbsolutePath().substring(ff.getAbsolutePath().lastIndexOf("."));
En caso de que no quieras hacerlo tú mismo-
utilizar Nombre de archivoUtils.getExtension de Apache Commons E/S–
String extension = FilenameUtils.getExtension("/path/to/file/mytext.txt");
o en tu caso –
String extension = FilenameUtils.getExtension(ff.getAbsolutePath());
-
FilenameUtils no está definido en ANDroid
–Hitesh Sahu
9 de marzo de 2017 a las 13:51
-
@HiteshSahu, es parte de Apache Commins IO mencionado en la respuesta.
– Amit K. Saha
13 de marzo de 2017 a las 17:42
-
que regresara
txt
o.txt
?– Daksh Agrawal
9 de enero de 2018 a las 7:16
-
debe devolver “txt” . @DakshAgrawal
– Amit K. Saha
30 de enero de 2018 a las 22:15
-
@AmitK.Saha el primer ejemplo devuelve “.txt”
– Eugenio
2 de marzo de 2018 a las 13:19
Podría hacerlo simplemente con una línea de código utilizando MIME Type Map.
Primero toma el archivo:
Uri file = Uri.fromFile(new File(filePath));
Después
String fileExt = MimeTypeMap.getFileExtensionFromUrl(file.toString());
-
La mejor y más sencilla solución integrada. Esta es la forma real de encontrar la extensión.
–Anand Savjani
5 de abril de 2019 a las 14:58
-
Esto no obtiene nada si tiene espacio antes de “.” en nombre del archivo
– mostafa3dmax
14 de junio de 2020 a las 5:12
-
¿Qué tan importante es agarrar el archivo primero? ¿Hay algún daño en simplemente pasar la cadena de nombre de archivo?
– Trevortni
16 de julio de 2020 a las 21:12
-
@AnandSavjani no funciona para “/almacenamiento/emulado/0/Descargar/descargar (1).jpeg” “/almacenamiento/emulado/0/Descargar/descargar (1) .jpeg”
– Ganesh Pokale
18 oct 2021 a las 6:47
-
No use esto. Esto no funciona si el nombre del archivo tiene caracteres especiales.
– Amit Bhandari
20 de diciembre de 2021 a las 8:49
agradable umang
Puedes poner tu código en tu actividad así:
private String getfileExtension(Uri uri)
{
String extension;
ContentResolver contentResolver = getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
extension= mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
return extension;
}
“uri” es el archivo uri del resultado del archivo seleccionado con el “botón Examinar”
mad_lad
Enfoque Kotlin:
val fileExtention: String = file.extension
Mira esto: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/extension.html
Función:
public String getExt(String filePath){
int strLength = filePath.lastIndexOf(".");
if(strLength > 0)
return filePath.substring(strLength + 1).toLowerCase();
return null;
}
Uso:
String ext = getExt(path);
if(ext != null && ext.equals("txt")){
// do anything
}
PD: si no usa toLowerCase (), es posible que la función devuelva mayúsculas y minúsculas (dependiendo del archivo existente).
Fuad Reza
En Kotlin
Puedes leer la documentación de MimeTypeMap aquí
Este es un ejemplo si está utilizando startActivityForResult
y obtienes datos de él. Entonces tu defines Content Resolver
para obtener el tipo mime del uri.
val uri: Uri? = it.data?.data
val contentResolver = requireContext().contentResolver
val stringMimeType = contentResolver.getType(uri!!)
Usando ese código, si elige el archivo pdf obtendrá algo como
“Solicitud PDF”
Después de eso, usando el MimeTypeMap
obtendrá las extensiones. No olvides que debes agregar getSingleton()
porque solo está disponible en singleton.
val stringFileType = MimeTypeMap.getSingleton().getExtensionFromMimeType(stringMimeType)
Saeef MD Zulker Naeen
Usé DocumentFile para obtener el nombre y la extensión del archivo.
DocumentFile documentFile = DocumentFile.fromSingleUri(YourActivity.this, fileUri);
String fileName = documentFile.getName();
String extension = fileName.substring(fileName.lastIndexOf("."));
Por ejemplo, si el nombre de su archivo es ‘su_imagen.jpg’, la extensión será ‘.jpg’
Muestre el código donde “explora Carpetas y selecciona archivos solamente”.
– CommonsWare
21 de junio de 2016 a las 18:26
Sí, lo he editado. Hay algunos archivos más para el Explorador de archivos, esos son para lógica, estos dos que he editado, son los archivos principales. Indique si esos también son necesarios. La ruta principal del archivo se almacena en filePath y el nombre del archivo se almacena en curFileName.
– Batí
21 de junio de 2016 a las 18:33
stackoverflow.com/questions/3571223/…
– CommonsWare
21 de junio de 2016 a las 18:44