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()メソッドがファイルのサイズにアクセスするのを防ぐ方法はありますか?

Ubuntu12.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 に答える