2012-05-03 14 views
27

W mojej aplikacji muszę nagrać wideo. Przed rozpoczęciem nagrywania przypisuję mu nazwę i katalog. Po zakończeniu nagrywania użytkownik ma możliwość zmiany nazwy pliku. Napisałem poniższy kod, ale wydaje mi się, że to nie działa.android, Jak zmienić nazwę pliku?

Gdy użytkownik wprowadzi nazwę pliku i kliknij przycisk będę to zrobić:

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

Tekst: jest to nazwa, która jest wpisana przez użytkownika. Aktualny Nazwa pliku: jest to nazwa, która jest przypisana przez mnie przed nagraniem MEDIA_NAME: nazwa folderu

logcat pokazuje to:

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 

Wszelkie sugestie będą mile widziane.

Odpowiedz

17

problem jest w tym wierszu,

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

Tu currentFileName jest rzeczywiście String nie trzeba używać "

spróbować to w ten sposób,

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

o, mój Boże! Jaki głupi błąd popełniłem !!!! Dzięki, drogi Sanjay. Teraz działa dobrze po tym, jak to zmieniłem. – Hesam

+7

@Hamera Czasami takie głupie błędy trwają cały czas .. :) Pozdrawiam. Dobre kodowanie :) – COD3BOY

+1

lol, każdy popełnia błędy, ale to naprawdę zabawne, po prostu zrób sobie przerwę i wróć do niego po pełnym naładowaniu energii . – Krypton

1

Podaj cel Obiekt pliku z inną nazwą pliku.

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

Jeśli plik jest duży, to podejście mogłoby sprowokować 'OutOfMemoryError' ... – nanounanue

+0

@nanounanue: dlaczego? Odczytuje/zapisuje 1kB na raz. – Harvey

1

powinieneś sprawdzić, czy katalog istnieje!

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

W kodzie:

Nie powinno to być:

File from = new File(directory, currentFileName);

zamiast

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


Dla bezpieczeństwa,

Użyj pliku File.renameTo(). Ale przed nazwaniem sprawdź istnienie katalogu!

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

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

+3

Wracam do tego rozwiązania co kilka miesięcy. Dziękuję ngen za zwięzłe rozwiązanie. <3 – Sipty

2

przykład Praca ...

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

najlepszy !! w górę głosować! – 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

użyć tej metody, aby zmienić nazwę pliku. Plik from zostanie zmieniony na to.

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

Przykładowy kod:

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

To, co skończyło się. Obsługuje przypadek, gdy istnieje plik o tej samej nazwie, dodając do nazwy pliku liczbę całkowitą.

@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; 
} 
Powiązane problemy