Dans mon application, je dois enregistrer une vidéo. Avant de commencer l'enregistrement, je lui attribue un nom et un répertoire. Une fois l'enregistrement terminé, l'utilisateur a la possibilité de renommer son fichier. J'ai écrit le code suivant mais semble que cela ne fonctionne pas.
Lorsque l'utilisateur entre le nom du fichier et clique sur le bouton, je vais le faire
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());
}
Texte: est le nom saisi par l'utilisateur . Nom de fichier actuel: est le nom que je lui ai attribué avant l'enregistrement MEDIA_NAME: nom du dossier
Logcat montre ceci:
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
Toute suggestion serait appréciée.
Le problème est dans cette ligne,
File from = new File(directory, "currentFileName");
Ici, currentFileName
est en fait une chaîne que vous ne devez pas utiliser "
essayez-le de cette façon
File from = new File(directory, currentFileName );
^ ^ //You dont need quotes
Utilisez cette méthode pour renommer un fichier. Le fichier from
sera renommé en to
.
private boolean rename(File from, File to) {
return from.getParentFile().exists() && from.exists() && from.renameTo(to);
}
Exemple de code:
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);
}
}
Exemple de travail ...
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..");
C'est ce que j'ai fini par utiliser. Il gère le cas où un fichier existant porte le même nom en ajoutant un entier au nom du fichier.
@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;
}
Fournissez à l'objet Fichier cible un nom de fichier différent.
// 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();
}
vous devriez vérifier si le répertoire existe!
File directory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), MEDIA_NAME);
if(!directory.exist()){
directory.mkdirs();
}
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);
}
}