2013-01-12 15 views
9

Mam plik, z którego usunąłem każde pozwolenie. Nikt nie powinien być w stanie odczytać pliku, prawda? W rzeczywistości, jeśli biegnęJava - file.length() zwraca, nawet jeśli plik nie jest czytelny.

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

uzyskać

false 

Jednak jeśli zadzwonię

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

uzyskać

455074 

To jest moje zrozumienie, że w celu aby uzyskać rozmiar pliku, należy otworzyć i przeczytać Najpierw plik, ale ten wynik zdecydowanie sugeruje, że się mylę. Czy ktoś wie, dlaczego tak się dzieje? Czy istnieje sposób, aby uniemożliwić dostęp do rozmiaru pliku przez metodę file.length() Java?

używam Ubuntu 12.10

+0

Czy system plików ext * zapisuje rozmiar? Spróbuj tego: plik 'cat/dev/urandom>; plik chmod 000; ls -sh file; 'Mogę się mylić, ale jestem prawie pewien, że' ls' może odczytać rozmiar pliku, nawet jeśli uprawnienia są zerowe. – BenjiWiebe

+6

Dlaczego musisz otworzyć plik, aby uzyskać jego długość? Zostaną one zapisane w katalogu informacji w systemie plików. – OldProgrammer

Odpowiedz

16

Mylisz: Długość pliku jest metadane systemu plików (przynajmniej dla systemów plików działających pod kontrolą systemu Linux VFS). Każdy, kto ma prawa odczytu do katalogu, widzi wszystkie zawarte pliki i ich rozmiary. Aby uniemożliwić użytkownikom zobaczenie rozmiaru pliku, musisz uniemożliwić mu oglądanie go w całości, tj. Umieścić plik w katalogu, który ma uprawnienia, takie jak drwxr-x---, jeśli użytkownik nie znajduje się w grupie powiązanej z katalogiem lub drwx------, jeśli użytkownik jest w tej grupie.

2

Nie rozumiem, dlaczego potrzebujesz dostępu do odczytu, aby zobaczyć rozmiar pliku. W Linuksie ls wyświetli zawartość wszystkich plików w katalogu (łącznie z ich rozmiarem), nawet jeśli nie masz na nie uprawnień, o ile posiadasz odpowiednie uprawnienia do katalogu zawierającego ten plik. Rozmiar pliku jest właściwością tabeli alokacji plików, a nie samego pliku, więc nie ma potrzeby sprawdzania samego pliku (i byłoby dość nieefektywne, aby uzyskać długość przez zliczenie liczby bajtów w plik).

Powiązane problemy