Java: Kiểm tra tập tin hoặc thư mục
Bạn có một đối tượng của lớp Path và nó thể hiện một tập tin hoặc một thư mục, nhưng tập tin đó có tồn tại trên hệ thống tập tin? Có thể đọc được không? Có thể ghi được không? Có thể thực thi được không?
Xác minh sự hiện hữu của một tập tin hoặc thư mục
Các phương thức trong lớp Path là cú pháp, có nghĩa là chúng hoạt động trên thể hiện của lớp Path. Nhưng cuối cùng, bạn phải truy cập vào hệ thống tập tin để xác minh rằng Path có tồn tại hay không. Bạn có thể làm như vậy với các phương thức exists(Path, LinkOption ...)
và notExists(Path, LinkOption ...)
. Lưu ý rằng !Files.exists(path)
không tương đương với Files.notExists(path)
. Khi ta đang thử nghiệm sự tồn tại của một tập tin, ba kết quả có thể là:
- Tập tin được xác định là tồn tại.
- Tập tin được xác định là không tồn tại.
- Không rõ trạng thái của tập tin. Kết quả này có thể xảy ra khi các chương trình không có quyền truy cập vào các tập tin.
Nếu cả hai phương thức exists
và notExists
đều trả về false thì không thể xác định được sự tồn tại của tập tin.
Kiểm tra khả năng truy cập tập tin
Để xác định rằng các chương trình có thể truy cập vào một tập tin khi cần thiết hay không, ta có thể sử dụng các phương thức isReadable(Path)
, isWritable(Path)
, và isExecutable(Path)
.
Đoạn mã dưới đây sẽ kiểm chứng rằng một tập tin cụ thể có tồn tại hay không và rằng chương trình có khả năng thực thi tập tin hay không.
boolean isRegularExecutableFile = Files.isRegularFile(file) &
Files.isReadable(file) & Files.isExecutable(file);
Lưu ý: Khi bất kỳ của những phương pháp này hoàn tất, không có đảm bảo rằng các tập tin có thể được truy cập. Một lỗ hổng bảo mật thường gặp trong nhiều ứng dụng là để thực hiện một kiểm tra và sau đó truy cập vào các tập tin. Để biết thêm thông tin, sử dụng công cụ tìm kiếm ưa thích của bạn để tìm kiếm
TOCTTOU
(phát âm TOCK-quá ).
Kiểm tra xem hai đường dẫn có định vị tới cùng một tập tin hay không
Khi bạn có một hệ thống tập tin trong đó có sử dụng các liên kết tượng trưng, thì có thể có hai đường dẫn khác nhau sẽ định vị tới cùng một tập tin. Phương thức isSameFile(Path, Path)
sẽ so sánh hai đường dẫn để xác định điều này. Ví dụ:
Path p2 = ...;
// Code here
}