2013-01-12 36 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()不需要检查实际的文件本身(并且通过计算文件的字节数来获取文件的长度是相当低效的文件)。

相关问题