2011-08-23 41 views
38

Tôi đang viết một tiện ích Java dòng lệnh đơn giản. Tôi muốn người dùng có thể chuyển vào đường dẫn tệp tương ứng với thư mục chính của họ bằng toán tử ~. Vì vậy, một cái gì đó như ~/Documents/...Cách xử lý ~ trong đường dẫn tệp

Câu hỏi của tôi là có cách nào để làm cho Java giải quyết loại đường dẫn này một cách tự động? Hoặc tôi có cần quét đường dẫn tệp cho toán tử ~ không?

Có vẻ như loại chức năng này sẽ được đưa vào đối tượng File. Nhưng nó không có vẻ như vậy.

+1

Hệ điều hành (s) là tiện ích của bạn dành cho? –

Trả lời

50

Một đơn giản path = path.replaceFirst("^~",System.getProperty("user.home")); khi nó được nhận từ người sử dụng (trước khi thực hiện một File ra của nó) là đủ để làm việc trong hầu hết các trường hợp.

+5

Hầu hết (tất cả?) Shell sẽ chỉ thực hiện thay thế khi argumetn * bắt đầu bằng * '~'. Đường dẫn '/ a/~/c/d.txt' sẽ được hiểu chính xác như được viết bởi bash, ví dụ. –

+0

@andrzej sau đó giải pháp của petr tốt hơn tuy nhiên tôi là một chút nhỏ gọn hơn –

+14

Chỉ cần hãy cẩn thận rằng điều này thực sự không làm việc tất cả các thời gian. "~ otheruser/Documents" cũng là một thư mục chính hợp lệ; nhưng không phải cho "user.home", đối với "user.home" của người khác. Ngoài ra, dấu ngã chỉ được mở rộng đến thư mục chính nếu đó là ký tự đầu tiên trong phần thư mục của đường dẫn. Trong khi độc đáo, "a ~" là một tệp hợp lệ không liên quan gì đến các thư mục chính. –

26

Đây là mở rộng vỏ cụ thể, vì vậy bạn cần phải thay thế nó ở đầu dòng, nếu có:

String path = "~/xyz"; 
... 
if (path.startsWith("~" + File.separator)) { 
    path = System.getProperty("user.home") + path.substring(1); 
} 

File f = new File(path); 
... 
+4

không nên là 'System.getProperty (" user.home ") + path.substring (2);' –

+0

có, cảm ơn, cố định –

8

Như Edwin Buck đã chỉ ra trong nhận xét cho câu trả lời khác, ~ otheruser/Documents cũng nên mở rộng chính xác. Dưới đây là một chức năng mà làm việc cho tôi:

public String expandPath(String path) { 
    try { 
     String command = "ls -d " + path; 
     Process shellExec = Runtime.getRuntime().exec(
      new String[]{"bash", "-c", command}); 

     BufferedReader reader = new BufferedReader(
      new InputStreamReader(shellExec.getInputStream())); 
     String expandedPath = reader.readLine(); 

     // Only return a new value if expansion worked. 
     // We're reading from stdin. If there was a problem, it was written 
     // to stderr and our result will be null. 
     if (expandedPath != null) { 
      path = expandedPath; 
     } 
    } catch (java.io.IOException ex) { 
     // Just consider it unexpandable and return original path. 
    } 

    return path; 
} 
+1

Vì nó phụ thuộc vào ls, phương thức expandPath do Dave M cung cấp chỉ hoạt động nếu đường dẫn tồn tại. – sfosdal

+1

+1 Việc khởi chạy một quy trình mới cho điều này có vẻ giống như một việc quá mức cần thiết, nhưng đó có lẽ là cách "chính xác" duy nhất. – minexew

4

Một câu trả lời khá gọn làm việc với những con đường với thực tế ~ nhân vật trong đó:

String path = "~/Documents"; 
path.replaceFirst("^~", System.getProperty("user.home")); 
+0

Điều này có lỗi giống như câu trả lời của @ ratchet: '~ foo' sẽ được thay thế bằng'/home/yournamefoo' thay vì '/ home/foo'. – bfontaine

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