2013-01-12 34 views
9

我有一個文件,從中我已經禁止了所有權限。沒有人應該能夠讀取文件,對吧?事實上,如果我跑Java - file.length()即使文件不可讀也會返回

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

我得到

false 

但是,如果我叫

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

我得到

455074 

這是我的理解是,爲了獲得文件大小必須打開並閱讀e文件,但這個結果強烈表明我錯了。有誰知道爲什麼發生這種情況?另外,有沒有辦法阻止Java的file.length()方法訪問文件的大小?

我使用Ubuntu 12.10

+0

ext *文件系統保存大小嗎?試試這個:'cat/dev/urandom> file; chmod 000文件; ls -sh文件;'我可能是錯的,但我很確定'即使權限爲零,ls'也可以讀取文件大小。 – BenjiWiebe

+6

爲什麼你必須打開文件才能獲得長度?這將被存儲在文件系統中的目錄信息中。 – OldProgrammer

回答

16

你弄錯了:一個文件的長度是文件系統元數據(至少在Linux下運行的VFS文件系統)。任何擁有讀取目錄權限的人都可以看到所有包含的文件及其大小。爲防止用戶看到文件的大小,您必須防止他們看到它的完全,即將文件放置在具有權限的目錄中,如drwxr-x---(如果用戶不在與該目錄關聯的組中)或drwx------(如果用戶是在那個小組裏。

2

我不明白爲什麼你需要閱讀權限才能查看文件的大小。在Linux中,只要您在包含文件的目錄上擁有適當的權限,即使您對它們沒有權限,ls也會顯示目錄中所有文件的內容(包括它們的大小)。文件的大小是文件分配表的屬性,而不是文件本身,因此length()不需要檢查實際的文件本身(並且通過計算文件的字節數來獲取文件的長度是相當低效的文件)。

相關問題