2012-05-03 15 views
27

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.android, ¿Cómo cambiar el nombre de un archivo?

Cuando el usuario entra en nombre de archivo y haga 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 se introduce por el usuario. Nombre del archivo actual: es el nombre que se le asigna por mí antes de grabar MEDIA_NAME: nombre de 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.

Respuesta

17

El problema está en esta línea,

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

Aquí currentFileName es en realidad una cadena que no tiene que utilizar "

tratan de esta manera,

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

¡Oh, Dios mío! ¡Qué error tan estúpido fue que hice! Gracias, querido Sanjay. Ahora, funciona bien después de que cambié eso. – Hesam

+7

@Hesam A veces esos errores tontos toman todo nuestro tiempo ... :) aplausos ... Codificación feliz :) – COD3BOY

+1

lol, todos cometen errores, pero esto es realmente divertido, solo toma un descanso y solo vuelve a él después de que estés completamente energizado . – Krypton

1

Proporcionar objeto de archivo de destino con 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(); 
} 
+1

Si el archivo es grande, este enfoque podría provocar un 'OutOfMemoryError' ... – nanounanue

+0

@nanounanue: ¿por qué? Lee/escribe 1kB a la vez. – Harvey

1

debe comprobar si el directorio existe.

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

En su código:

¿No debería ser:

File from = new File(directory, currentFileName);

en lugar de

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


Por seguridad,

Utilice 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

+3

Sigo volviendo a esta solución cada dos meses. Gracias ngen por la solución concisa. <3 – Sipty

2

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.."); 
+1

mejor !! ¡voto! – Fortran

3

/** 
* 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); 
    } 
} 
6

Utilice este método para cambiar el nombre de un archivo. El archivo from cambiará de nombre a to.

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

código 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); 
    } 
} 
1

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; 
} 
Cuestiones relacionadas