2013-01-12 30 views
9

Tôi có một tệp mà từ đó tôi đã loại bỏ mọi quyền. Không ai có thể đọc được tập tin, đúng không? Trong thực tế, nếu tôi chạyJava - file.length() trả về ngay cả khi tệp không đọc được

File f = new File("not_readable.pdf"); 
System.out.println(f.canRead()) 

tôi nhận được

false 

Tuy nhiên, nếu tôi gọi

File f = new File("not_readable.pdf"); 
System.out.println(f.length()) 

tôi nhận được

455074 

Đó là sự hiểu biết của tôi rằng để để có được kích thước của một tập tin phải mở và đọc thứ e tệp đầu tiên, nhưng kết quả này cho thấy rằng tôi sai. Có ai biết tại sao điều này xảy ra không? Ngoài ra, có cách nào để ngăn chặn phương thức file.length() của Java truy cập kích thước của một tệp không?

Tôi đang sử dụng Ubuntu 12.10

+0

Hệ thống tệp ext * có lưu kích thước không? Hãy thử tập tin này: 'cat/dev/urandom>; chmod 000 tập tin; ls -sh tập tin; 'Tôi có thể sai, nhưng tôi khá chắc chắn' ls' có thể đọc kích thước tập tin ngay cả khi quyền là số không. – BenjiWiebe

+6

Tại sao bạn phải mở tệp để có độ dài? Điều đó sẽ được lưu trữ trong thông tin thư mục trong hệ thống tệp. – OldProgrammer

Trả lời

16

Bạn đang nhầm lẫn: Chiều dài của một tập tin là hệ thống tập tin siêu dữ liệu (ít nhất là cho các hệ thống tập tin chạy dưới VFS Linux). Bất kỳ ai đã đọc quyền truy cập vào thư mục đều có thể xem tất cả các tệp được chứa và kích thước của chúng. Để ngăn người dùng nhìn thấy kích thước của tệp, bạn phải ngăn họ xem toàn bộ, tức là đặt tệp trong thư mục có quyền như drwxr-x--- nếu người dùng không nằm trong nhóm được liên kết với thư mục hoặc drwx------ nếu người dùng trong nhóm đó.

2

Tôi không hiểu tại sao bạn cần có quyền truy cập đọc để xem kích thước của tệp. Trong Linux, ls sẽ hiển thị nội dung của tất cả các tệp trong thư mục (bao gồm kích thước của chúng), ngay cả khi bạn không có quyền đối với chúng, miễn là bạn có quyền thích hợp trên thư mục chứa tệp. Kích thước của tệp là thuộc tính của bảng phân bổ tệp, không phải là tệp, do đó, length() không cần phải kiểm tra tệp thực sự (và nó sẽ không hiệu quả để có được độ dài bằng cách đếm số byte trong tập tin).

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