Geschützte Systemdateien sinnvoll umgehen bei listFiles()

mandypb86

Mitglied
Hallo zusammen,

ich habe einen Dateibrowser mittels RCP nachgebaut (RCP spielt bei dem Problem aber keine Rolle). Mein Betriebssystem ist Windows 7 (ich nehme an, dass das gleiche Problem auch unter Vista auftreten würde).

Wenn ich die listFiles-Methode in meinem ContentProvider in der hasChildren-Methode aufrufe, hagelt es NullPointerExceptions und zwar bei den Ordnern, die Win 7 "schützt", sprich

  • Dokumente und Einstellungen
  • Documents and Settings
  • Programme
  • System Volumen Information

Ich hab auch gar nicht die Intention, diese Ordner anzeigen zu lassen, sondern will einfach nur die NullPointerExceptions vermeiden.

Ich hab jetzt nen hundsgewöhnlichen try-catch-Block drumherum gesetzt und im catch-Block gebe ich false zurück (zur Erinnerung: hasChildren).
Aber das kann doch nicht Sinn und Zweck sein.

canExecute() liefert übrigens netterweise true zurück, obwohl es eigentlich so gar nicht true ist.
canRead() ebenfalls.

Hier mal ein Schnipsel Code:

Java:
public boolean hasChildren(Object element) {
		if(element instanceof Song){
			try{
				boolean isDir = ((Song)element).getFile().isDirectory();
				if(isDir){
					if(((Song)element).getFile().canExecute()){
						System.out.println("canExecute() = true");
						return ((Song)element).getFile().listFiles().length>0 ? true : false;
					}
					else{
						System.out.println("canExecute() = false");
						return false;
					}
				}
				return false;
				//return true;
			}
			catch(NullPointerException npe){
				System.out.println("NPE in hasChildren() in ArchiveBrowserContentProvider: " + npe.toString());
				return false;
			}
			
		}
		return false;
	}

Und hier ein Ausschnitt der Console:

Code:
Exception in listSongs: java.io.FileNotFoundException: C:\hiberfil.sys (Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird)
Exception in listSongs: java.io.FileNotFoundException: C:\pagefile.sys (Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird)
canRead() = true
canRead() = true
canRead() = true
NPE in hasChildren() in ArchiveBrowserContentProvider: java.lang.NullPointerException
canRead() = true
NPE in hasChildren() in ArchiveBrowserContentProvider: java.lang.NullPointerException
canRead() = true
canRead() = true
canRead() = true
canRead() = true
NPE in hasChildren() in ArchiveBrowserContentProvider: java.lang.NullPointerException
canRead() = true
canRead() = true
NPE in hasChildren() in ArchiveBrowserContentProvider: java.lang.NullPointerException
canRead() = true
canRead() = true
canRead() = true
canRead() = true

Die ersten beiden Exceptions sind noch ein anderes Thema. Der Workaround dort ist mir aber erstmal recht.

Hat vielleicht jemand eine Idee, wie man diese tollen Ordner in Windows behandelt? Oder muss ich mich meinem Schicksal fügen?

Lieben Gruß
M@ndy
 
kann eigentlich nicht sein, weil

a) werden die Song-Objekte nie ohne zugehöriges File angelegt und
b) tauchen die Ordner an sich im Viewer auf

Kann es trotzdem gleich mal machen, zur Sicherheit. Bin ja gar nicht so.

Und was meinst du mit can* ausgeben? Er geht doch in die if-Abfrage rein, muss also true sein, oder hab ich seit Jahren nen falsches Verständnis einer if-Abfrage? *g*

EDIT:
getFile sind alle != null (hab ich auch so erwartet)
canExecute ist auch immer true

Hier ein neues Console Log:

Code:
$Recycle.Bin true
Boot true
Documents and Settings true
NPE in hasChildren() in ArchiveBrowserContentProvider: Documents and Settings: java.lang.NullPointerException
Dokumente und Einstellungen true
NPE in hasChildren() in ArchiveBrowserContentProvider: Dokumente und Einstellungen: java.lang.NullPointerException
PerfLogs true
Program Files true
ProgramData true
Programme true
NPE in hasChildren() in ArchiveBrowserContentProvider: Programme: java.lang.NullPointerException
Recovery true
System Volume Information true
NPE in hasChildren() in ArchiveBrowserContentProvider: System Volume Information: java.lang.NullPointerException
temp true
Users true
Windows true
WMP3E_PRO true

Noch ne Idee? *g*
 
Zuletzt bearbeitet:
Vielleicht prüfen ob listFiles() null liefert???

Edit:

Die Methode liefert nämlich in mehreren Fällen null zurück.
 
Zuletzt bearbeitet:
ähäm... *pfeif* *schäm*

wär vllt ne Idee *g* die sogar funktioniert

AUA

aber gut, kann der try-catch-Block ja wieder weg

Thx fürs Augen öffnen

EDIT:

Auf die gleiche Weise kann ich den beiden (und Ähnlichen) Kandidaten sicher auch begegnen, oder?

Code:
Exception in listSongs: java.io.FileNotFoundException: C:\hiberfil.sys (Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird)
Exception in listSongs: java.io.FileNotFoundException: C:\pagefile.sys (Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird)

Kann da da ein canRead() bzw canExecute() helfen?

Irgendwo hängt er sich beim Wechseln des Inputs des Viewers nämlich immer auf und zeigt dann überhaupt keine Directories mehr an. Denke, das liegt auch noch daran.
 
Zuletzt bearbeitet:
Wo du die File-API schon verlinkst:

die isHidden()-Methode tut ihren Job viel besser als canRead() und canExecute(), besonders, was die tollen geschützten Windows-Ordner angeht

So kann man sie auch gleich raus"filtern", weil wenn man eh nicht drauf zugreifen kann, braucht man sie auch nicht anzuzeigen.

Das gleiche gilt dann auch für die geschützten Dateien, die die "Zugriff verweigert"-Exception ausgelöst haben. Es soll doch schonmal helfen, die API mal zu lesen.
 

Zurück
Oben