2012-09-20 32 views
6

Tôi đang sử dụng Oracle Java 7 trên Windows 64 bit.Làm thế nào để lực lượng Java 7 để tạo "thư mục symlinks" trên Windows thay vì "tập tin symlinks"?

Khi tôi tạo ra một liên kết tượng trưng bằng Files.createSymbolicLink, tôi nhận thấy hành vi này:

  1. Nếu mục tiêu là một thư mục, một "thư mục liên kết tượng trưng" được tạo ra.
  2. Nếu mục tiêu là một tệp, một "liên kết tượng trưng tệp" được tạo.
  3. Nếu mục tiêu không tồn tại, một "liên kết tượng trưng tệp" được tạo.

The type of the symlink is fixed and never changes, bất kể bất kỳ thay đổi nào đối với mục tiêu của nó.

Sử dụng lệnh gốc của Windows mklink, có thể buộc loại liên kết là "liên kết tượng trưng thư mục". Có thể đạt được điều này bằng cách sử dụng Java API gốc hoặc một số thư viện không?

Một cách tầm thường và xấu xí là:

  1. Nếu mục tiêu là một thư mục, chỉ cần tạo liên kết
  2. Nếu mục tiêu không tồn tại, tạo ra một thư mục đích trống mới, tạo liên kết, và xóa thư mục.
  3. Nếu mục tiêu là một tệp ... hãy xử lý nó (di chuyển nó, áp dụng # 2, di chuyển nó trở lại).

Fugly.

Trả lời

2

Rất tiếc, tôi không thấy cách nào trong các API Java để thực hiện.

Tôi đã kiểm tra mã của Windows JRE và có vẻ như quyết định được dựa trên thuộc tính tập tin bản thân:

try 
{ 
    WindowsFileAttributes windowsfileattributes = WindowsFileAttributes.get(windowspath2, false); 
    if(windowsfileattributes.isDirectory() || windowsfileattributes.isDirectoryLink()) 
     i |= 1; 
} 

Các thuộc tính bản thân có nguồn gốc từ mẹ đẻ mã, và có vẻ như không có cách nào để ảnh hưởng đến chúng.

Rõ ràng bạn có các tùy chọn khác như gọi thủ công mklink hoặc thậm chí thao tác các đối tượng được trả về bằng cách sử dụng một cái gì đó như PowerMock (điều này rõ ràng không có ý nghĩa cho mục đích này).

Một tùy chọn bẩn khác là tạo proxy của tất cả các lớp có liên quan: Path, FileSystemFileSystemProvider.
Cách hoạt động là số Path trả về số FileSystem trả về số FileSystemProvider - những gì bạn cần làm là sửa đổi cách thức hoạt động của phương thức FileSystemProvider.createSymbolicLink.

Phương pháp createSymbolicLink nhận một đối số varargs mà hiện chưa được sử dụng - bạn có thể vượt qua một cuộc tranh cãi với nó rằng sẽ chỉ wrapper của bạn mà nó cần phải ghi đè lên các đường liên kết tượng trưng được tạo ra - và có bạn đi :)

Sau khi viết tất cả những điều này - câu hỏi duy nhất tôi có là - tại sao bạn cần loại hành vi này?

+0

Trên thực tế không có nhu cầu lớn, tôi vừa phát hiện hành vi này thông qua lỗi trong chương trình của tôi khiến mục tiêu của liên kết tượng trưng không được tạo. – ripper234

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