2013-01-12 5 views
9

J'ai un fichier à partir duquel j'ai supprimé toutes les permissions. Personne ne devrait être capable de lire le fichier, n'est-ce pas? En fait, si je lanceJava - file.length() renvoie même si le fichier n'est pas lisible

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

Je reçois

false 

Cependant, si je l'appelle

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

Je reçois

455074 

Je crois comprendre que, pour obtenir la taille d'un fichier, il faut ouvrir et lire le Le dossier d'abord, mais ce résultat suggère fortement que j'ai tort. Est-ce que quelqu'un sait pourquoi cela se produit? De même, existe-t-il un moyen d'empêcher la méthode file.length() de Java d'accéder à la taille d'un fichier?

J'utilise Ubuntu 12.10

+0

Le système de fichiers ext * enregistre-t-il la taille? Essayez ceci: 'cat/dev/urandom> fichier; chmod 000 fichier; ls -sh fichier; 'Je peux me tromper, mais je suis certain que' ls' peut lire la taille du fichier même si les permissions sont nulles. – BenjiWiebe

+6

Pourquoi devez-vous ouvrir le fichier pour obtenir la longueur? Cela serait stocké dans les informations du répertoire dans le système de fichiers. – OldProgrammer

Répondre

16

Vous vous trompez: La longueur d'un fichier est métadonnées du système de fichiers (au moins pour les systèmes de fichiers en cours d'exécution sous le VFS Linux). Toute personne ayant lu les autorisations sur un répertoire peut voir tous les fichiers contenus et leurs tailles. Pour empêcher les utilisateurs de voir la taille d'un fichier, vous devez les empêcher de le voir complètement, c'est-à-dire placer le fichier dans un répertoire ayant des permissions comme drwxr-x--- si l'utilisateur n'est pas dans le groupe associé au répertoire ou drwx------ si l'utilisateur est dans ce groupe.

2

Je ne vois pas pourquoi vous auriez besoin d'un accès en lecture pour voir la taille d'un fichier. Sous Linux, ls affichera le contenu de tous les fichiers dans le répertoire (y compris leur taille), même si vous n'avez aucune autorisation sur eux, tant que vous avez les permissions appropriées sur le répertoire qui contient le fichier. La taille d'un fichier est une propriété de la table d'allocation des fichiers, pas le fichier lui-même, donc length() n'a pas besoin d'inspecter le fichier lui-même (et il serait assez inefficace pour obtenir la longueur en comptant le nombre d'octets le fichier).

Questions connexes