2013-01-12 19 views
9

Her izni bastığım bir dosyam var. Dosyayı kimse okumamalı, değil mi? BenJava - file.length(), dosya okunamıyor olsa bile döner.

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

çalıştırırsanız Aslında, benim anlayış ben

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

ararsanız ben Ancak

false 

olsun ben

455074 

sağlaması için Bir dosyanın boyutunu almak için bir tane açmalı ve okunmalıdır. e önce dosya, ama bu sonuç kesinlikle yanlış olduğumu gösterir. Bunun neden olduğunu bilen var mı? Ayrıca, Java'nın file.length() yönteminin bir dosyanın boyutuna erişmesini engellemenin bir yolu var mı? Ben

+0

ext * dosya sistemi boyutu kaydediyor mu? Bunu deneyin: 'cat/dev/urandom> dosya; chmod 000 dosyası; ls -sh dosyası; 'Yanlış olabilirim, ama eminim ki izinler sıfır olsa bile dosya boyutunu okuyabiliyor. – BenjiWiebe

+6

Uzunluğu almak için dosyayı neden açmalısınız? Bu, dosya sisteminde dizin bilgisinde saklanırdı. – OldProgrammer

cevap

16

Ubuntu 12.10 kullanıyorum

Yanılıyorsun: Bir dosyanın uzunluğu (en azından Linux VFS altında çalışan dosya sistemleri için) dosya sistemi meta veridir. Bir dizine okuma izni olan herkes, içerilen dosyaların tümünü ve boyutlarını görebilir. Kullanıcıların bir dosyanın boyutunu görmesini engellemek için, onları tamamen görmelerini engellemeniz gerekir; yani, kullanıcı diziyle ilişkili grupta değilse drwxr-x--- gibi izinlere sahip bir dizine veya kullanıcı varsa drwx------ o grupta.

2

Bir dosyanın boyutunu görüntülemek için neden okuma erişimine gereksiniminiz olduğunu anlamıyorum. Linux'ta, ls, dosyada yer alan dizinde uygun izinlere sahip olduğunuz sürece, bunlarda izinleriniz olmasa bile dizindeki tüm dosyaların içeriğini (boyutları dahil) görüntüler. Bir dosyanın boyutu, dosya tahsis tablosunun bir özelliğidir, dosyanın kendisi değil, bu nedenle length() gerçek dosyanın kendisini denetlemeye gerek yoktur (ve bu sayede bayt sayısını belirleyerek uzunluğu elde etmek oldukça verimsiz olur. dosya).