Java kullanarak dosyayı yeniden adlandırma


174

Bir dosyayı söyleyecek test.txtşekilde yeniden adlandırabilir miyiz test1.txt?

Varsa test1.txtyeniden adlandırılacak mı?

Mevcut test1.txt dosyasına nasıl yeniden adlandırabilirim, böylece yeni test.txt içeriği daha sonra kullanılmak üzere eklenir?


6
Son paragrafınız hiç bir yeniden adlandırma işlemi tanımlamıyor. Bir ekleme işlemini açıklar.
Lorne

Yanıtlar:


173

Http://exampledepot.8waytrips.com/egs/java.io/RenameFile.html adresinden kopyalandı

// File (or directory) with old name
File file = new File("oldname");

// File (or directory) with new name
File file2 = new File("newname");

if (file2.exists())
   throw new java.io.IOException("file exists");

// Rename file (or directory)
boolean success = file.renameTo(file2);

if (!success) {
   // File was not successfully renamed
}

Yeni dosyaya eklemek için:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);

24
Bu kod tüm durumlarda veya platformlarda çalışmaz. Yöntemin yeniden adlandırılması güvenilir değildir: stackoverflow.com/questions/1000183/…
Stephane Grenier

Sadece Pathbenim için çalışıyor, renameToher zaman yanlış döndürür. Ya Kontrol kr37 cevabını veya bu cevabı
kiscica

107

Kısacası:

Files.move(source, source.resolveSibling("newname"));

Daha fazla detay:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Aşağıdakiler doğrudan http://docs.oracle.com/javase/7/docs/api/index.html adresinden kopyalanır :

Dosyayı aynı dizinde tutarak dosyayı "yeni ad" olarak yeniden adlandırmak istediğimizi varsayalım:

Path source = Paths.get("path/here");
Files.move(source, source.resolveSibling("newname"));

Alternatif olarak, aynı dosya adını koruyarak ve bu adın varolan herhangi bir dosyayı dizinde değiştirerek dosyayı yeni bir dizine taşımak istediğimizi varsayalım:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);

1
Yol, yalnızca uygulamaları WindowsPath, ZipPath ve AbstractPath olan bir arabirimdir. Bu çoklu platform uygulamaları için bir sorun olacak mı?
Caelum

1
Merhaba @ user2104648, burada ( tutorials.jenkov.com/java-nio/path.html ) Linux ortamında dosyaları nasıl ele alabileceğinize bir örnektir. Temel olarak, bahsettiğiniz uygulamalardan birini kullanmak yerine java.nio.file.Paths.get (somePath) kullanmanız gerekir
maxivis

2
Path source = ... nedir?
Koray Tugay

@ kr37 kusursuz cevap!
gaurav

30

Bir File nesnesinde renameTo yöntemini kullanmak istiyorsunuz .

İlk olarak, hedefi temsil edecek bir File nesnesi oluşturun. Dosyanın var olup olmadığını kontrol edin. Yoksa, taşınacak dosya için yeni bir File nesnesi oluşturun. taşınacak dosyada renameTo yöntemini çağırın ve aramanın başarılı olup olmadığını görmek için renameTo öğesinden döndürülen değeri kontrol edin.

Bir dosyanın içeriğini diğerine eklemek istiyorsanız, bir dizi yazar vardır. Uzantıya dayanarak, düz metin gibi geliyor, bu yüzden FileWriter'a bakardım .


9
Bilmiyorum, ama kaynak kod olmadan Pierre'in paylaştığı şeyle aynı ...
Thomas Owens

28

Java 1.6 ve daha düşük sürümler için, bunun için en güvenli ve en temiz API'nın Guava'nın Files.move olduğuna inanıyorum .

Misal:

File newFile = new File(oldFile.getParent(), "new-file-name.txt");
Files.move(oldFile.toPath(), newFile.toPath());

İlk satır, yeni dosyanın konumunun aynı dizinde, yani eski dosyanın üst dizininde olmasını sağlar.

EDIT: Ben çok benzer bir yaklaşım tanıttı Java 7 kullanmaya başlamadan önce yazdım. Java 7+ kullanıyorsanız kr37'nin cevabını görmeli ve güncellemelisiniz.


18

Dosyayı yeni bir ada taşıyarak yeniden adlandırma. (FileUtils, Apache Commons IO lib'den alınmıştır)

  String newFilePath = oldFile.getAbsolutePath().replace(oldFile.getName(), "") + newName;
  File newFile = new File(newFilePath);

  try {
    FileUtils.moveFile(oldFile, newFile);
  } catch (IOException e) {
    e.printStackTrace();
  }

13

Bir dosyayı yeniden adlandırmanın kolay bir yoludur:

        File oldfile =new File("test.txt");
        File newfile =new File("test1.txt");

        if(oldfile.renameTo(newfile)){
            System.out.println("File renamed");
        }else{
            System.out.println("Sorry! the file can't be renamed");
        }

5
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.*;

Path yourFile = Paths.get("path_to_your_file\text.txt");

Files.move(yourFile, yourFile.resolveSibling("text1.txt"));

Varolan bir dosyayı "text1.txt" adıyla değiştirmek için:

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING);

5

Bunu dene

File file=new File("Your File");
boolean renameResult = file.renameTo(new File("New Name"));
// todo: check renameResult

Not: Platforma bağımlı (farklı İşletim sistemi, farklı dosya sistemi) ve yeniden adlandırma başarısız olursa IO istisnasını atmadığından, yeniden adlandırma dosyasının başarılı olduğundan emin olmak için her zaman renameTo return değerini kontrol etmeliyiz.


Bu, 9 yıl önce Pierre tarafından verilen kabul edilen cevaptan nasıl farklı?
Yem

4

Evet, File.renameTo () öğesini kullanabilirsiniz. Ancak, yeni bir dosya olarak yeniden adlandırırken doğru yola sahip olmayı unutmayın.

import java.util.Arrays;
import java.util.List;

public class FileRenameUtility {
public static void main(String[] a) {
    System.out.println("FileRenameUtility");
    FileRenameUtility renameUtility = new FileRenameUtility();
    renameUtility.fileRename("c:/Temp");
}

private void fileRename(String folder){
    File file = new File(folder);
    System.out.println("Reading this "+file.toString());
    if(file.isDirectory()){
        File[] files = file.listFiles();
        List<File> filelist = Arrays.asList(files);
        filelist.forEach(f->{
           if(!f.isDirectory() && f.getName().startsWith("Old")){
               System.out.println(f.getAbsolutePath());
               String newName = f.getAbsolutePath().replace("Old","New");
               boolean isRenamed = f.renameTo(new File(newName));
               if(isRenamed)
                   System.out.println(String.format("Renamed this file %s to  %s",f.getName(),newName));
               else
                   System.out.println(String.format("%s file is not renamed to %s",f.getName(),newName));
           }
        });

    }
}

}



2

Bildiğim kadarıyla, bir dosyayı yeniden adlandırmak, içeriğini hedef adı olan mevcut bir dosyaya eklemez.

Java bir dosya yeniden adlandırma hakkında bkz belgelere için renameTo()sınıfta yöntemle File.


1
Files.move(file.toPath(), fileNew.toPath()); 

çalışır, ancak sadece TÜM kullanılmış kaynakları kapattığınızda (veya otomatik kapatırken) ( InputStream, FileOutputStreamvb.) file.renameToveya aynı durum ile düşünüyorum FileUtils.moveFile.


1

Bir klasördeki birden çok dosyayı başarıyla yeniden adlandırmak için kodumu İşte:

public static void renameAllFilesInFolder(String folderPath, String newName, String extension) {
    if(newName == null || newName.equals("")) {
        System.out.println("New name cannot be null or empty");
        return;
    }
    if(extension == null || extension.equals("")) {
        System.out.println("Extension cannot be null or empty");
        return;
    }

    File dir = new File(folderPath);

    int i = 1;
    if (dir.isDirectory()) { // make sure it's a directory
        for (final File f : dir.listFiles()) {
            try {
                File newfile = new File(folderPath + "\\" + newName + "_" + i + "." + extension);

                if(f.renameTo(newfile)){
                    System.out.println("Rename succesful: " + newName + "_" + i + "." + extension);
                } else {
                    System.out.println("Rename failed");
                }
                i++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

ve bir örnek için çalıştırın:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");

-2

Koşu kodu burada.

private static void renameFile(File fileName) {

    FileOutputStream fileOutputStream =null;

    BufferedReader br = null;
    FileReader fr = null;

    String newFileName = "yourNewFileName"

    try {
        fileOutputStream = new FileOutputStream(newFileName);

        fr = new FileReader(fileName);
        br = new BufferedReader(fr);

        String sCurrentLine;

        while ((sCurrentLine = br.readLine()) != null) {
            fileOutputStream.write(("\n"+sCurrentLine).getBytes());
        }

        fileOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fileOutputStream.close();
            if (br != null)
                br.close();

            if (fr != null)
                fr.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

2
Genellikle, bazı anonim kod satırlarını göndermek yerine bir çözümü açıklamak daha iyidir. Okuyabiliyorsun İyi bir cevap yazmak nasıl da ve tamamen kod tabanlı cevapları açıklanması
Anh Pham

Kopyalama ve yeniden adlandırma genellikle farklı işlemlerdir, bu yüzden bunun bir kopya olduğu açıkça işaretlenmelidir. Bu da baytları değil karakterleri kopyalarken gereksiz yavaş olur.
Joel Klinghed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.