9

我有一个文件,我从该文件中禁止了所有权限。应该没有人能够读取文件,对吧?事实上,如果我跑

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

我的理解是,为了获得文件的大小,必须先打开并读取文件,但这个结果强烈表明我错了。有谁知道为什么会这样?另外,有没有办法阻止 Java 的 file.length() 方法访问文件的大小?

我正在使用 Ubuntu 12.10

4

2 回答 2

16

你错了:文件的长度是文件系统元数据(至少对于在 Linux VFS 下运行的文件系统)。任何对目录具有读取权限的人都可以查看所有包含的文件及其大小。为了防止用户看到文件的大小,您必须完全阻止他们看到它,即将文件放在具有权限的目录中,例如drwxr-x---用户不在与该目录关联的组中,或者drwx------如果用户在该目录中团体。

于 2013-01-12T03:35:48.067 回答
2

我不明白为什么您需要读取权限才能查看文件的大小。在 Linux 中,ls将显示目录中所有文件的内容(包括它们的大小),即使您对它们没有权限,只要您对包含该文件的目录具有适当的权限。文件的大小是文件分配表的属性,而不是文件本身,因此length()不需要检查实际文件本身(通过计算文件中的字节数来获取长度是非常低效的)文件)。

于 2013-01-12T03:36:48.863 回答