2012-05-03 16 views
27

Nella mia applicazione, ho bisogno di registrare video. Prima di iniziare la registrazione, sto assegnando un nome e una directory. Al termine della registrazione, l'utente ha la possibilità di rinominare il suo file. Ho scritto il seguente codice ma sembra che non funzioni.android, Come rinominare un file?

Quando l'utente inserisce il nome del file e cliccare sul tasto Farò questo:

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()); 
    } 

Testo: è il nome che viene immesso dall'utente. Nome file corrente: è il nome che è assegnato da me prima di registrare MEDIA_NAME: nome della cartella

Logcat mostra questo:

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 

Ogni suggerimento sarebbe apprezzato.

risposta

17

Il problema è in questa linea,

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

Qui currentFileName è in realtà una stringa non dovete utilizzare "

provare in questo modo,

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

oh, mio ​​dio! Che stupido errore è stato che l'ho fatto !!!! Grazie caro Sanjay. Ora funziona bene dopo averlo cambiato. – Hesam

+7

@Hesam A volte questi errori stupidi prendono tutto il nostro tempo .. :) applausi ... Codifica di coccole :) – COD3BOY

+1

lol, tutti fanno errori ma questo è davvero divertente, prenditi una pausa e torna indietro dopo esserti energizzato . – Krypton

1

Fornire oggetto File di destinazione con nome file diverso.

// 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

Se il file è grande, questo approccio potrebbe provocare un OutOfMemoryError' ... – nanounanue

+0

@nanounanue ': perché? Legge/scrive 1 KB alla volta. – Harvey

1

si dovrebbe verificare se la directory esiste!

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

Nel codice:

non dovrebbe essere:

File from = new File(directory, currentFileName);

invece di

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


Per sicurezza,

Utilizzare File.renameTo(). Ma controlla l'esistenza della directory prima di rinominarla!

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); 
} 

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

+3

Continuo a tornare a questa soluzione ogni due mesi. Grazie per la soluzione concisa. <3 – Sipty

2

esempio Lavorare ...

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

meglio !! 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

Utilizzare questo metodo per rinominare un file. Il file from verrà rinominato in to.

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

codice Esempio:

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

Questo è quello che ho finito per usare. Gestisce il caso in cui esiste un file esistente con lo stesso nome aggiungendo un intero al nome del file.

@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; 
}