Permissions of Folders/Files

Basti4231

Bekanntes Mitglied
Hey Leute,

ich lese das Laufwerk C: ein. Dort gibt es bestimmte Ordner, die nicht geöffnet werden dürfen (Kein Zugriffsrecht).

Beim Einlesen dieser nicht zugriffsberechtigten Ordner, wird die NullPointerException geworfen. Da ich aber vorher frage, ob ich da Rechte zum Lesen habe und ich true zurückgeliefert bekomme, gehe ich normalerweise davon aus, dass ich da auch Rechte habe...
Komisch ist nur, dass ich gar nicht true zurückgeliefert bekommen dürfte auf diesen Ordnern...
Habe den Pfad meines "verbotenen" Ordners als String in ein neues File gesteckt und auf dem File dann canRead(), canWrite() abgefragt - Ergebnis: beide liefern true.

Wie ist das möglich? Gibt es irgendwelche Tücken bei canRead(), canWrite() auf einem File?

Hier übrigens die Methode, bei der die Nullpointer geworfen wird (Die, fürs Einlesen von C: )

Java:
private void readFolder(File f) {
		if (f != null)
			if (f.exists()) {
				if (f.canRead())
					if (f.isDirectory())
						for (File tmpFile : f.listFiles()) {
							if (tmpFile.isDirectory() && !tmpFile.isHidden()) {
								// .isHidden(), because there is no permission
								// on
								// most hidden Files
								System.out.println(tmpFile.getAbsolutePath()
										+ " ");
								folderCounter++;
								readFolder(tmpFile);

							} else if (tmpFile.isFile() && !tmpFile.isHidden())
								fileCounter++;
						}
			}
}

@EDIT: Wenn ich die Methode des SecurityManagers "checkRead(f.getAbsolutePath()) aufrufe, sagt der mir Access denied in Form einer Exception. Komisch, dass der es kapiert und das File nicht... 😀

Gruß Basti 🙂
 
Zuletzt bearbeitet:
Bei fehlenden Zugriffsrechten kommt eigentlich keine NullPointerException sondern IOException (glaub ich). Insofern liegt der Fehler nicht daran. Ich habe mir die Doku zu listFiles() angeschaut (File#listFiles() (Java Platform SE 6)) ). Dort steht, dass wenn man das auf einem Nicht-Ordner aufruft oder beim Zugriff ein I/O-Error auftritt, die Methode null returnt. Nachdem Du nicht prüftst, ob das übergebene File (Parameter f) ein Directory ist, vermute ich, dass in Zeile 5 (die for-Schleife) deswegen eine NullPointerException fliegt.
 
Zuletzt bearbeitet von einem Moderator:
Stimmt, müsste eigentlich der Grund sein.
Habs jetzt getestet mit einer Überprüfung noch for der for-Schleife. Führt leider zu keinem anderen Ergebnis...

Ich aktualisiere oben mal meinen Code... 🙂
 
Erstmal zum Code: Die ganzen if-Verschachtelungen kannst Du kürzen, indem Du die Bedingungen mit && verknüpfst. && ist ein sog. Shortcut-Operator. D.h., wenn eine Bedingung schon false ist, werden die ganzen restlichen überhaupt nicht mehr evaluiert. Das macht Deinen Code schonmal etwas übersichtlicher. Außerdem kannst Du Dir das exists() sparen. Das wird von canRead() mit überprüft. Schreibe also statt der Verschachtelungen lieber folgendes:
[Java]
// Habe auch die Reihenfolge der Prüfungen umgestellt. Macht so glaub ich mehr Sinn
if ( f!=null && f.isDirectory() && f.canRead() ) {
...
}
[/Java]
Wenn Du das gemacht hast, dann zum Problem. Teste Deinen neuen Code. Falls die NullPointerException immer noch fliegt (wird sie wohl ziemlich sicher) poste die NullPointerException bitte inkl StackTrace und auch Deinen neuen Code. Mappe die Zeilennummer in der Exception bitte auf die Zeilennummern des von Dir geposteten Codes. Dann wissen wir schonmal ganz sicher wo sie fliegt. Das kann vielleicht Hinweise auf das Warum liefern.
 
Java:
Exception in thread "main" java.lang.NullPointerException
		at de.basti.StructuredReader.readFolder(StructuredReader.java:98)
		at de.basti.StructuredReader.readFolder(StructuredReader.java:105)
		at de.basti.StructuredReader.readFolder(StructuredReader.java:105)
		at de.basti.StructuredReader.readFileFolder(StructuredReader.java:71)
		at de.basti.Send.main(SendVirus.java:14)


Die Zeile 98 ist folgende:

Java:
for (File tmpFile : f.listFiles()) {

Also ist der trotz der Prüfungen in den Ordner gegangen und versucht die Unterordner/Dateien aufzulisten, was er nicht dürfte...

Gruß Basti
 
Bei welchen Ordnern kommt es denn zu einer NullPointerException? Hast dir das schon einmal ausgeben lassen?

Windows 7? Wenn ja, überprüfen ob dies beim Benutzer Ordner auftritt. Denn der Ordner ist nur ein Link für Users.

Alternativ kannst du natürlich abfragen ob dir listFiles() null zurückliefert.
 
Ja sind Benutzerordner, aber nicht nur...
Ich kann ja sagen, dass ich nur den Benutzerordner des aktuellen Benutzers haben will. Da habe ich ja Zugriff. Des wäre nicht des Problem, nur halt dass der einfach n canRead() true liefert bei so nem Benutzerordner ohne Rechte. Des stört mich ein wenig...

@Edit: Windows XP
@Edit2: Ich habe es jetzt mit der Abfrage von listFiles() auf null gemacht. Das haut hin, vielen Dank 🙂

Gruß Basti
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben