เปลี่ยนชื่อไฟล์โดยใช้ Java


174

เราสามารถเปลี่ยนชื่อไฟล์ที่test.txtจะพูดได้test1.txtหรือไม่?

หากtest1.txtมีอยู่แล้วจะเปลี่ยนชื่อหรือไม่

ฉันจะเปลี่ยนชื่อเป็นไฟล์ test1.txt ที่มีอยู่แล้วเพื่อเพิ่มเนื้อหาใหม่ของ test.txt ไว้เพื่อใช้ในภายหลังได้อย่างไร


6
ย่อหน้าสุดท้ายของคุณไม่ได้อธิบายการดำเนินการเปลี่ยนชื่อเลย มันอธิบายการดำเนินการผนวก
มาร์ควิสแห่ง Lorne

คำตอบ:


173

คัดลอกมาจากhttp://exampledepot.8waytrips.com/egs/java.io/RenameFile.html

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

หากต้องการต่อท้ายไฟล์ใหม่:

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

24
รหัสนี้ใช้ไม่ได้กับทุกกรณีหรือทุกแพลตฟอร์ม การเปลี่ยนชื่อเป็นวิธีไม่น่าเชื่อถือ: stackoverflow.com/questions/1000183/…
Stephane Grenier

ทางเดียวเท่านั้นที่ใช้ได้ผลPathกับฉันrenameToเสมอกลับเท็จ ตรวจสอบคำตอบของ kr37หรือคำตอบนี้
andras

107

ในระยะสั้น:

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

รายละเอียดเพิ่มเติม:

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

ต่อไปนี้จะถูกคัดลอกโดยตรงจากhttp://docs.oracle.com/javase/7/docs/api/index.html :

สมมติว่าเราต้องการเปลี่ยนชื่อไฟล์เป็น "newname" ทำให้ไฟล์อยู่ในไดเรกทอรีเดียวกัน:

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

อีกทางหนึ่งสมมติว่าเราต้องการย้ายไฟล์ไปยังไดเรกทอรีใหม่เก็บชื่อไฟล์เดิมและแทนที่ไฟล์ที่มีอยู่ของชื่อนั้นในไดเรกทอรี:

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

1
Path เป็นอินเทอร์เฟซที่มีการใช้งานเฉพาะ WindowsPath, ZipPath และ AbstractPath นี่จะเป็นปัญหาสำหรับการใช้งานหลายแพลตฟอร์มหรือไม่?
Caelum

1
สวัสดี @ user2104648 ที่นี่ ( tutorials.jenkov.com/java-nio/path.html ) เป็นตัวอย่างเกี่ยวกับวิธีจัดการไฟล์ในระบบ Linux โดยทั่วไปคุณต้องใช้ java.nio.file.Paths.get (somePath) แทนที่จะใช้หนึ่งในการใช้งานที่คุณกล่าวถึง
maxivis

2
Path source = ... คืออะไร
Koray Tugay

@ kr37 คำตอบที่สมบูรณ์แบบ!
gaurav

30

คุณต้องการใช้เมธอดrenameToในวัตถุFile

ก่อนอื่นให้สร้างวัตถุไฟล์เพื่อแสดงปลายทาง ตรวจสอบว่าไฟล์นั้นมีอยู่หรือไม่ หากไม่มีอยู่ให้สร้างวัตถุไฟล์ใหม่เพื่อย้ายไฟล์ เรียกใช้เมธอด renameTo ในไฟล์ที่จะย้ายและตรวจสอบค่าที่ส่งคืนจาก renameTo เพื่อดูว่าการโทรสำเร็จหรือไม่

หากคุณต้องการผนวกเนื้อหาของไฟล์หนึ่งไปยังอีกไฟล์หนึ่งจะมีนักเขียนจำนวนหนึ่ง ขึ้นอยู่กับการขยายดูเหมือนข้อความธรรมดาของมันดังนั้นฉันจะมองไปที่FileWriter


9
ไม่มีความคิด แต่มันเป็นสิ่งเดียวที่แน่นอนว่าปิแอร์โพสต์โดยไม่ต้องรหัสที่มา ...
โทมัส Owens

28

สำหรับ Java 1.6 และลดผมเชื่อว่าปลอดภัยและสะอาด API สำหรับเรื่องนี้คือฝรั่งของFiles.move

ตัวอย่าง:

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

บรรทัดแรกตรวจสอบให้แน่ใจว่าที่ตั้งของไฟล์ใหม่เป็นไดเรกทอรีเดียวกันนั่นคือ ไดเรกทอรีหลักของไฟล์เก่า

แก้ไข: ฉันเขียนสิ่งนี้ก่อนที่ฉันจะเริ่มใช้ Java 7 ซึ่งแนะนำวิธีการที่คล้ายกันมาก ดังนั้นหากคุณกำลังใช้ Java 7+ คุณควรเห็นและตอบคำถามของ kr37


18

การเปลี่ยนชื่อไฟล์โดยการย้ายไปที่ชื่อใหม่ (FileUtils มาจาก Apache Commons IO lib)

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

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

13

นี่เป็นวิธีที่ง่ายในการเปลี่ยนชื่อไฟล์:

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

ในการแทนที่ไฟล์ที่มีอยู่ด้วยชื่อ "text1.txt":

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

5

ลองสิ่งนี้

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

หมายเหตุ: เราควรตรวจสอบการเปลี่ยนชื่อเพื่อส่งคืนค่าเพื่อให้แน่ใจว่าการเปลี่ยนชื่อไฟล์นั้นสำเร็จเพราะขึ้นอยู่กับแพลตฟอร์ม (ระบบปฏิบัติการที่แตกต่างกัน, ระบบไฟล์ที่แตกต่างกัน) และมันจะไม่ทิ้งข้อยกเว้น IO หากการเปลี่ยนชื่อล้มเหลว


นี่แตกต่างจากคำตอบที่ปิแอร์ยอมรับเมื่อ 9 ปีก่อนหรือไม่?
อาหารสัตว์

4

ใช่คุณสามารถใช้ File.renameTo () แต่อย่าลืมว่ามีเส้นทางที่ถูกต้องในขณะที่เปลี่ยนชื่อเป็นไฟล์ใหม่

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

    }
}

}


3

ถ้ามันเป็นเพียงแค่เปลี่ยนชื่อไฟล์ที่คุณสามารถใช้File.renameTo ()

ในกรณีที่คุณต้องการที่จะผนวกเนื้อหาของแฟ้มที่สองจะเป็นครั้งแรกที่จะดูที่FileOutputStream กับตัวเลือกผนวกคอนสตรัคหรือสิ่งเดียวกันสำหรับ FileWriter คุณจะต้องอ่านเนื้อหาของไฟล์เพื่อผนวกและเขียนออกโดยใช้เอาต์พุตสตรีม / ตัวเขียน


2

เท่าที่ฉันรู้การเปลี่ยนชื่อไฟล์จะไม่ผนวกเนื้อหาของไฟล์นั้นต่อท้ายไฟล์ที่มีอยู่ด้วยชื่อเป้าหมาย

เกี่ยวกับการเปลี่ยนชื่อแฟ้มใน Java ให้ดูที่เอกสารสำหรับวิธีการในชั้นเรียนrenameTo()File


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

ผลงาน แต่เมื่อคุณปิด (หรือ AutoClose) ทรัพยากรที่ใช้ทั้งหมด ( InputStream, FileOutputStreamฯลฯ ) ผมคิดว่าสถานการณ์เดียวกันด้วย หรือfile.renameToFileUtils.moveFile


1

นี่คือรหัสของฉันเพื่อเปลี่ยนชื่อหลายไฟล์ในโฟลเดอร์สำเร็จ:

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

}

และเรียกใช้เป็นตัวอย่าง:

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

-2

ใช้รหัสอยู่ที่นี่

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
โดยปกติแล้วจะเป็นการดีกว่าที่จะอธิบายวิธีแก้ปัญหาแทนที่จะเพียงแค่โพสต์แถวของรหัสที่ไม่ระบุชื่อ คุณสามารถอ่านฉันจะเขียนคำตอบที่ดีได้อย่างไรและอธิบายคำตอบที่อิงกับรหัสทั้งหมด
Anh Pham

การคัดลอกและเปลี่ยนชื่อมักจะเป็นการดำเนินการที่แตกต่างกันดังนั้นฉันคิดว่าควรทำเครื่องหมายไว้อย่างชัดเจนว่านี่เป็นสำเนา ซึ่งยังเกิดขึ้นจะไม่จำเป็นช้าตามที่คัดลอกอักขระและไม่ไบต์
Joel Klinghed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.