Android, ¿cómo cambiar el nombre de un archivo?

En mi aplicación, necesito grabar video. Antes de comenzar a grabar, le estoy asignando un nombre y un directorio. Una vez finalizada la grabación, el usuario tiene la capacidad de cambiar el nombre de su archivo. Escribí el siguiente código pero parece que no funciona.

Cuando el usuario ingresa el nombre del archivo y hace clic en el botón Voy a hacer esto:

private void setFileName(String text) { String currentFileName = videoURI.substring(videoURI.lastIndexOf("/"), videoURI.length()); currentFileName = currentFileName.substring(1); Log.i("Current file name", currentFileName); File directory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), MEDIA_NAME); File from = new File(directory, "currentFileName"); File to = new File(directory, text.trim() + ".mp4"); from.renameTo(to); Log.i("Directory is", directory.toString()); Log.i("Default path is", videoURI.toString()); Log.i("From path is", from.toString()); Log.i("To path is", to.toString()); } 

Texto: es el nombre que ingresa el usuario. Nombre de archivo actual: es el nombre que asigné antes de grabar MEDIA_NAME: nombre de la carpeta

Logcat muestra esto:

 05-03 11:56:37.295: I/Current file name(12866): Mania-Karaoke_20120503_115528.mp4 05-03 11:56:37.295: I/Directory is(12866): /mnt/sdcard/Movies/Mania-Karaoke 05-03 11:56:37.295: I/Default path is(12866): /mnt/sdcard/Movies/Mania-Karaoke/Mania-Karaoke_20120503_115528.mp4 05-03 11:56:37.295: I/From path is(12866): /mnt/sdcard/Movies/Mania-Karaoke/currentFileName 05-03 11:56:37.295: I/To path is(12866): /mnt/sdcard/Movies/Mania-Karaoke/hesam.mp4 

Cualquier sugerencia sería apreciada.

El problema está en esta línea,

 File from = new File(directory, "currentFileName"); 

Aquí currentFileName es en realidad una cadena que no tienes que usar "

pruébalo de esta manera,

 File from = new File(directory, currentFileName ); ^ ^ //You dont need quotes 

En tu código:

No debería ser:

File from = new File(directory, currentFileName);

en lugar de

File from = new File(directory, "currentFileName");


Por seguridad,

Use el File.renameTo (). ¡Pero compruebe la existencia del directorio antes de cambiarle el nombre!

 File dir = Environment.getExternalStorageDirectory(); if(dir.exists()){ File from = new File(dir,"from.mp4"); File to = new File(dir,"to.mp4"); if(from.exists()) from.renameTo(to); } 

Consulte: http://developer.android.com/reference/java/io/File.html#renameTo%28java.io.File%29

Use este método para cambiar el nombre de un archivo. El archivo from se renombrará to .

 private boolean rename(File from, File to) { return from.getParentFile().exists() && from.exists() && from.renameTo(to); } 

Código de ejemplo:

 public class MainActivity extends Activity { private static final String TAG = "YOUR_TAG"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); File currentFile = new File("/sdcard/currentFile.txt"); File newFile new File("/sdcard/newFile.txt"); if(rename(currentFile, newFile)){ //Success Log.i(TAG, "Success"); } else { //Fail Log.i(TAG, "Fail"); } } private boolean rename(File from, File to) { return from.getParentFile().exists() && from.exists() && from.renameTo(to); } } 

 /** * ReName any file * @param oldName * @param newName */ public static void renameFile(String oldName,String newName){ File dir = Environment.getExternalStorageDirectory(); if(dir.exists()){ File from = new File(dir,oldName); File to = new File(dir,newName); if(from.exists()) from.renameTo(to); } } 

Ejemplo de trabajo …

  File oldFile = new File("your old file name"); File latestname = new File("your new file name"); boolean success = oldFile .renameTo(latestname ); if(success) System.out.println("file is renamed.."); 

Proporcione al objeto Archivo de destino un nombre de archivo diferente.

 // Copy the source file to target file. // In case the dst file does not exist, it is created void copy(File source, File target) throws IOException { InputStream in = new FileInputStream(source); OutputStream out = new FileOutputStream(target); // Copy the bits from instream to outstream byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } 

¡debes verificar si el directorio existe!

 File directory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), MEDIA_NAME); if(!directory.exist()){ directory.mkdirs(); } 

Esto es lo que terminé usando. Maneja el caso donde hay un archivo existente con el mismo nombre agregando un entero al nombre del archivo.

 @NonNull private static File renameFile(@NonNull File from, @NonNull String toPrefix, @NonNull String toSuffix) { File directory = from.getParentFile(); if (!directory.exists()) { if (directory.mkdir()) { Log.v(LOG_TAG, "Created directory " + directory.getAbsolutePath()); } } File newFile = new File(directory, toPrefix + toSuffix); for (int i = 1; newFile.exists() && i < Integer.MAX_VALUE; i++) { newFile = new File(directory, toPrefix + '(' + i + ')' + toSuffix); } if (!from.renameTo(newFile)) { Log.w(LOG_TAG, "Couldn't rename file to " + newFile.getAbsolutePath()); return from; } return newFile; } 
  public void renameFile(File file,String suffix) { String ext = FilenameUtils.getExtension(file.getAbsolutePath()); File dir = file.getParentFile(); if(dir.exists()){ File from = new File(dir,file.getName()); String name = file.getName(); int pos = name.lastIndexOf("."); if (pos > 0) { name = name.substring(0, pos); } File to = new File(dir,name+suffix+"."+ext); if(from.exists()) from.renameTo(to); } }