2009-12-16 35 views
16

Tôi hơi bối rối với tất cả các lớp File I/O mới này trong JDK7.Làm cách nào để đổi tên (không di chuyển) tệp trong JDK7?

Giả sử, tôi có Path và muốn đổi tên tệp, nó đại diện.
Tôi làm cách nào để chỉ định tên mới, khi một lần nữa, Path được mong đợi?

Path p = /* path to /home/me/file123 */; 
Path name = p.getName(); /* gives me file123 */ 
name.moveTo(/* what now? */); /* how to rename file123 to file456? */ 

LƯU Ý: Tại sao tôi cần JDK7? Xử lý liên kết tượng trưng!

Vấn đề là: Tôi phải làm điều đó với các tệp, tên và vị trí được biết khi chạy. Vì vậy, những gì tôi cần, là một phương pháp an toàn (không có tác dụng phụ đặc biệt) để tạo tên mới-Đường dẫn của một số tên cũ-Đường dẫn.

Path newName(Path oldName, String newNameString){ 
    /* magic */ 
} 

Trả lời

6

Bạn có một chuỗi đường dẫn và bạn cần phải tạo một đối tượng Path. Bạn có thể làm điều này với phương thức getPath hoặc giải quyết. Dưới đây là một cách:

Path dir = oldFile.getParent();   
    Path fn = oldFile.getFileSystem().getPath(newNameString); 
    Path target = (dir == null) ? fn : dir.resolve(fn);   
    oldFile.moveTo(target); 

Lưu ý rằng nó kiểm tra xem cha mẹ có rỗng không (trông giống như giải pháp của bạn không làm điều đó).

0

Nếu đường dẫn đích trùng với đường dẫn nguồn trừ tên của tập tin, nó sẽ được đổi tên chứ không phải di chuyển.

Vì vậy, ví dụ của bạn, con đường MoveTo nên

/home/me/file456 
+1

Vì vậy, tôi chỉ có thể tạo một 'Đường dẫn' mới? Có cái gì đơn giản hơn: Path newName = Paths.get (name.getParent(). ToString() + pathSeparator + "newName"); ? –

+0

Vâng, bây giờ câu hỏi là: làm thế nào để tạo ra con đường như vậy một cách an toàn, để không có trường hợp ngoại lệ nào sẽ khiến nó thất bại. –

+0

Tôi có thể cố gắng mô tả cách bạn có thể lấy đường dẫn ban đầu, bỏ tên 'file123' nối 'file456' thay vào đó và gọi 'name.moveTo()' nhưng vì tôi không thực sự biết Java, tôi sẽ đoán .Những gì tôi ** chắc chắn ** về là một * di chuyển * trở thành một * đổi tên * nếu chỉ có tên tập tin là khác nhau. – pavium

1

Nếu bạn có một cái nhìn tại Apache Commons IO có một lớp được gọi là FileNameUtils. Điều này làm một tấn công cụ wrt. tên đường dẫn tập tin và sẽ (trong số những thứ khác) đáng tin cậy chia tên đường dẫn vv Tôi nghĩ rằng sẽ giúp bạn có được một chặng đường dài hướng tới những gì bạn muốn.

+0

Xin lỗi, tôi cần các API nhận biết liên kết tượng trưng. Tất cả các công cụ Apache Commons này đều có khả năng tương thích tốt nhất với Java-5, nhưng chủ yếu là Java-1.4. –

+0

Nó không giúp bạn hoàn toàn trong việc chia tách và tập hợp lại tên tập tin, và bạn có thể sử dụng công cụ nhận thức liên kết tượng trưng của Java 7 để thực sự thực hiện sao chép/đổi tên không? –

+0

Chức năng tốt để xử lý các liên kết tượng trưng chỉ được cung cấp bởi JDK7, bởi vì nó có các liên kết cấp thấp (cấp nhị phân) cho hệ điều hành. –

4

OK, sau khi thử tất cả mọi thứ ra, có vẻ như tôi thấy phương pháp đúng:

// my helper method 
Path newName(Path oldFile, String newNameString){ 
    // the magic is done by Path.resolve(...) 
    return oldFile.getParent().resolve(newNameString); 
} 

// so, renaming is done by: 
oldPath.moveTo(newName(oldFile, "newName")); 
0

Nếu bạn không thể yêu cầu Java làm những gì bạn muốn với Unix, tôi khuyên bạn nên sử dụng các tập lệnh Python (do chương trình Java của bạn chạy). Python đã nhận được hỗ trợ cho Unix scripting và nó không Perl :) Điều này nghe có vẻ không phù hợp với bạn nhưng thực sự trong một chương trình lớn hơn, bạn sẽ được hưởng lợi từ việc sử dụng công cụ thích hợp cho công việc.

47

Trong JDK7, Files.move() cung cấp một cú pháp ngắn gọn và súc tích cho các tập tin đổi tên:

Path newName(Path oldName, String newNameString){ 
    return Files.move(oldName, oldName.resolveSibling(newNameString)); 
} 

tiên chúng ta đang nhận được đường dẫn đến tên tập tin mới sử dụng Path.resolveSibling() và chúng tôi sử dụng Files.move() làm việc đổi tên thực tế .

Các vấn đề liên quan