2009-10-12 2 views
6

Cách ngắn gọn nhất để tạo thư mục có tên "Foo" bên dưới thư mục làm việc hiện tại của ứng dụng Java của tôi (nếu nó chưa tồn tại) là gì?Làm cách nào để tạo thư mục trong thư mục làm việc hiện tại, trong Java

Hoặc, một góc hơi khác: Java tương đương với Directory.CreateDirectory("Foo") trong .NET là gì?

+0

Bạn đã đặt câu hỏi và ngay lập tức đăng câu trả lời của riêng mình? – KLE

+0

-1. Có vẻ rất lạ khi đăng câu hỏi và câu trả lời. Stack Overflow không phải là một microphone để bạn có thể thuyết trình. –

+4

+1. Là tốt để gửi câu hỏi và câu trả lời của riêng bạn. Giúp cộng đồng và hữu ích để tham khảo trong tương lai. Nếu mọi người không đồng ý với câu trả lời của bạn thì họ có thể cung cấp câu trả lời tốt hơn. Tìm kiếm * nhanh * trên Meta SO dường như đồng ý rằng điều này là tốt. – Iain

Trả lời

7

Gói java.io không có một lớp Directory, nhưng bạn có thể sử dụng phương pháp mkdir() trên lớp File thay vì:

(new File("Foo")).mkdir() 

Lưu ý rằng mkdir() có hai chế độ thất bại riêng biệt:

  1. "Nếu người quản lý bảo mật tồn tại và phương pháp checkWrite() của nó không cho phép tạo thư mục được đặt tên" thì SecurityException sẽ bị ném.
  2. Nếu hoạt động không thành công vì lý do khác, mkdir() sẽ trả về false. (Cụ thể hơn, nó sẽ trở lại đúng khi và chỉ khi thư mục đã được tạo ra.)

điểm 1 là ok - nếu bạn không có sự cho phép, ném. Điểm 2 là một ít tối ưu hóa phụ vì ba lý do:

  1. Bạn cần kiểm tra kết quả boolean từ phương pháp này. Nếu bạn bỏ qua kết quả, thao tác có thể âm thầm thất bại.
  2. Nếu bạn nhận được khoản hoàn trả sai, bạn không biết tại sao hoạt động thất bại, điều này gây khó khôi phục hoặc xây dựng một thông báo lỗi có ý nghĩa.
  3. Từ ngữ "nếu và chỉ nếu" nghiêm ngặt của hợp đồng cũng có nghĩa là phương thức trả về false nếu thư mục đã tồn tại.

Ngoài: Contrast điểm 3 với hành vi của .NET Directory.CreateDirectory() mà không có gì nếu thư mục tồn tại. Loại ý nghĩa này - "tạo một thư mục "; "ok, thư mục được tạo ". Có quan trọng nếu nó đã được tạo ngay bây giờ hoặc sớm hơn; bằng quy trình này hay quy trình khác? Nếu bạn thực sự quan tâm đến điều đó, bạn sẽ không hỏi một câu hỏi khác nhau : "Thư mục này có tồn tại không?"

Thông báo trước là mkdir() sẽ không tạo nhiều thư mục cùng một lúc. Ví dụ đơn giản của tôi về một thư mục có tên "Foo", điều này là tốt; tuy nhiên, nếu bạn muốn tạo một thư mục có tên Bar trong thư mục Foo (tức là để tạo thư mục "Foo/Bar"), bạn phải nhớ sử dụng phương thức mkdirs() để thay thế.

Vì vậy, để làm việc xung quanh tất cả những hãy cẩn thận, bạn có thể sử dụng một phương pháp helper như sau:

public static File createDirectory(String directoryPath) throws IOException { 
    File dir = new File(directoryPath); 
    if (dir.exists()) { 
     return dir; 
    } 
    if (dir.mkdirs()) { 
     return dir; 
    } 
    throw new IOException("Failed to create directory '" + dir.getAbsolutePath() + "' for an unknown reason."); 
} 
+0

Bạn đã đặt câu hỏi và ngay lập tức đăng câu trả lời của riêng bạn? –

+5

Nhìn thấy rằng trước đây, ý tưởng là người dùng đăng câu hỏi + câu trả lời kết hợp muốn trình bày một câu trả lời kỹ lưỡng cho một số câu hỏi mà có vẻ đơn giản trong một ngữ cảnh sẽ chỉ đạo những người chưa biết làm thế nào để làm điều đó câu trả lời riêng. Hoàn toàn chấp nhận được trong quan điểm của tôi mặc dù một chút khó hiểu. – Esko

+1

Ah, vì vậy bây giờ tôi biết phần "Blog" của tầm nhìn Stackoverflow (http://sstatic.net/so/Img/stackoverflow-venn-diagram.png) xuất phát từ :) – sfussenegger

1

Tôi đã nhìn thấy một hình thức hơi ngắn gọn hơn của phương pháp createDirectory của bạn:

File f = new File(xyz); 
if (!f.exists() && !f.mkdirs()) throw new IOException("Could not create directory " + f); 

Nó cũng có thể là đáng giá để kiểm tra nếu f tồn tại nhưng không phải là một thư mục.