2010-02-01 36 views
12

Chúng ta nói về java 1.6 tại đây. Kể từ khi liên kết symoblic chưa được hỗ trợ, làm thế nào có thể kiểm tra sự tồn tại của chúng.Java: kiểm tra sự tồn tại của tệp liên kết tượng trưng

1: tell Thời tiết các tập tin liên kết bản thân tồn tại (trở lại đúng ngay cả khi liên kết bị phá vỡ)

2: làm theo các liên kết và nói với Thời tiết cơ bản tập tin tồn tại.

Thực sự không có cách nào để nhận ra điều này ngoại trừ JNI?

+0

Một giải pháp tốt hơn được sao chép từ Apache FileUtils có thể được tìm thấy tại đây: http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Gray

Trả lời

1

Sau đây sẽ cho bạn một sự khởi đầu:

if (file.exists() && !file.isDirectory() && !file.isFile()) { 
    // it is a symbolic link (or a named pipe/socket, or maybe some other things) 
} 

if (file.exists()) { 
    try { 
     file.getCanonicalFile(); 
    } catch (FileNotFoundException ex) { 
     // it is a broken symbolic link 
    } 
} 

EDIT: Trên đây don 't làm việc như tôi nghĩ vì file.isDirectory() và file.isFile() giải quyết một liên kết tượng trưng. (Chúng tôi sống và học tập!)

Nếu bạn muốn xác định chính xác, bạn sẽ cần phải sử dụng JNI để thực hiện các cuộc gọi thư viện riêng có liên quan đến hệ điều hành gốc.

+0

Cảm ơn, nhưng file.exists() sẽ trả về false cho liên kết tượng trưng mà tôi nghĩ. – solotim

+1

Nó không có trên Linux. Nhưng không may, file.isFile() và file.isDirectory() giải quyết một liên kết tượng trưng và trả về một kết quả dựa trên kiểu của đối tượng được giải quyết. –

+0

Nó trả về false trên Linux. Bạn cũng có thể tham khảo phần đánh giá của http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4956115. – solotim

1

hmm..not yet supported..will nó từng được hỗ trợ là câu hỏi đến với tâm trí của tôi khi nhìn vào câu hỏi này ... liên kết tượng trưng là nền tảng cụ thể và Java được cho là nền tảng độc lập. tôi nghi ngờ nếu bất cứ điều gì sắp xếp là có thể với java như vậy .. bạn có thể phải nghỉ mát để mã nguồn gốc cho phần này và sử dụng JNI để cầu nó với phần còn lại của chương trình của bạn trong java.

+1

Java1.7 sẽ triển khai giao diện liên kết tượng trưng, ​​vậy nên cân nhắc của chúng về nền tảng độc lập là gì? – solotim

+0

hmm..điều thú vị .. bạn có thể muốn xem xét vấn đề này: http: // stackoverflow.com/questions/813710/java-1-6-defined-symbolic-links – Aadith

5

Nó chậm nhưng bạn có thể so sánh getAbsolutePath() và getCanonicalPath() của Tệp. Vì vậy, chỉ sử dụng bên ngoài đường dẫn mã hiệu suất quan trọng.

+1

Điều này không hoạt động đối với các liên kết Windows, chỉ có các liên kết tượng trưng * nix. – searchengine27

0

# 2 thật dễ dàng: chỉ cần sử dụng File.isFile v.v., sẽ đi qua liên kết. Phần khó là # 1.

Vì vậy, nếu bạn không thể sử dụng java.nio.file, và muốn tránh JNI vv, điều duy nhất tôi tìm thấy trong đó hoạt động:

static boolean exists(File link) { 
    File[] kids = link.getParentFile().listFiles(); 
    return kids != null && Arrays.asList(kids).contains(link); 
} 

Không terribly hiệu quả nhưng đơn giản.

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