Bug in File.isDirectory()?

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Hi,

ich hatte ja schon immer den Eindruck das mit File.isDirectory was nicht ganz koscher ist.

Ich bin grade am Bugfixing für das UltraVNC-Applet, dabei ist mir aufgefallen, das beim Filetransfer Fenster oftmals (aber nicht immer) Dateien als Verzeichnisse angezeigt werden, obwohl es 100% Dateien und nicht Verzeichnisse.

Die betreffende Stelle im Code des VNC-Applets sieht so aus:

Code:
	public void changeLocalDirectory(File dir)
	{
			if(DEBUG) System.out.println("inside changeRemoteDrive() / FTPFrame...");
			if(DEBUG) System.out.println("Given parameter File: " + dir.getName());
			currentLocalDirectory = dir;	// Updates Global
			File allFiles[] = dir.listFiles();	// Reads files
			String[] contents = dir.list();

			localList.clear();
			localList.addElement(" [..]");
			
			// sort content list
			Arrays.sort(contents);
			
			// Populate the Lists
			for (int i = 0; i < contents.length; i++)
			{
				if (allFiles[i].isDirectory()) {
					// localList.addElement("[" + contents[i] + "]");
					localDirList.add(" [" + contents[i] + "]"); // sf@2004
					System.out.println(contents[i] + " is a directory");
				}
				else
				{
					// localList.addElement(contents[i]);
					localFileList.add(" " + contents[i]); // sf@2004
					System.out.println(contents[i] + " is a file");
				}
			}

Die Methode geht noch weiter, aber ich seh schon hier an der Ausgabe, das was nicht stimmt:

Code:
jdk-6u2-linux-i586.rpm is a directory

Das ist schon mal glatt gelogen:

Code:
file jdk-6u2-linux-i586.rpm
jdk-6u2-linux-i586.rpm: RPM v3 bin i386 jdk-1.6.0_02-fcs

Um nun mögliche Seiteneffekte auszuschließen, hab ich mir obigen Code 1:1 in eine Main-Methode reinkopiert und das nochmal überprüft. Der Code sieht so aus:

Code:
public class TestShit {
	
	static boolean DEBUG = true;
	static File dir = new File("/home/jollyroger/");  
	static File currentLocalDirectory = null;  
	static Vector localList = new Vector();
	static ArrayList localFileList = new ArrayList();
	static ArrayList localDirList = new ArrayList();
	
	public static void main(String[] args) {

			if(DEBUG) System.out.println("inside changeRemoteDrive() / FTPFrame...");
			if(DEBUG) System.out.println("Given parameter File: " + dir.getName());
			currentLocalDirectory = dir;	// Updates Global
			File allFiles[] = dir.listFiles();	// Reads files
			String[] contents = dir.list();

			localList.clear();
			localList.addElement(" [..]");
			
			// sort content list
			Arrays.sort(contents);
			
			// Populate the Lists
			for (int i = 0; i < contents.length; i++)
			{
				if (allFiles[i].isDirectory()) {
					// localList.addElement("[" + contents[i] + "]");
					localDirList.add(" [" + contents[i] + "]"); // sf@2004
					System.out.println(contents[i] + " is a directory");
				}
				else
				{
					// localList.addElement(contents[i]);
					localFileList.add(" " + contents[i]); // sf@2004
					System.out.println(contents[i] + " is a file");
				}
			}
	}

}

Wie ihr seht ist der bis auf die Variablendeklarationen und Initialisierung vor der main-Methode identisch zum Original.

Das Resultat ist auch das gleiche, nämlich wieder:

Code:
jdk-6u2-linux-i586.rpm is a directory

Wie kann das sein?

Ich hab schon nach einem derartigen Bug gesucht, aber nichts dergleichen gefunden?

Weiss jemand was hier los ist?

System-Infos:

Java:

Code:
java -version
java version "1.5.0_10"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)

OS:

Code:
cat /etc/SuSE-release
openSUSE 10.2 (i586)
VERSION = 10.2
 
S

SlaterB

Gast
das ist ja mal ein ignorantes Vorgehen,
dein riesiger Code kann doch durchaus mal was falsch machen,
wieso nicht den einfachen Weg gehen?

File f = new File("dein baseDir/jdk-6u2-linux-i586.rpm");
System.out.println("is directory: "+f.isDirectory()); // vielleicht noch auf exist prüfen, um Tippfehler auszuschließen

siehst, läuft, war doch ganz einfach ;)


so und jetzt verrate ich mal noch nicht sofort, was in deinem Programm schief läuft,
obwohl jeder Hinweis es im Grunde auch schon verrät:
benutze in der Ausgabe (zusätzlich) allFiles.getName()
 

jollyroger

Bekanntes Mitglied
Oh Mann,

ich brauch mehr Kaffee.......wie konnte ich das __nicht__ sehen.........

Nun ja, danke für den Stupser......... :wink:
 
S

SlaterB

Gast
hmm, stimmte jetzt meine Theorie, dass dir.listFiles() und dir.list(); eine andere Reihenfolge haben?
ich glaubte das nach dem Posting immer weniger,
zumal du den Test ja wohl wiederholt hast und bei mir auf Windows die Reihenfolge gleich ist ;)

edit: ah, du hast ja noch ein sort drin, böse ;)
obwohl unter Windows die Reihenfolge auch schon alphabetisch ist..
 

Murray

Top Contributor
Die Reihenfolge kommt wohl erst durch das explizites Sortieren des contents-Arrays durcheinander.
 

jollyroger

Bekanntes Mitglied
Ja,

aufgrund dicker Tomaten auf den Augen hab ich dieses fatale

Code:
Arrays.sort(contents);

völlig übersehen......... :wink:

Was ich trotzdem mehr als nur verwirrend finde:

listFiles()
Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname.

list()
Returns an array of strings naming the files and directories in the directory denoted by this abstract pathname.

listFiles() liefert aber auch die directories zurück?
 

Murray

Top Contributor
Ja, hier könnte die Dokumentation etwas genauer sein. Wenn man weiter liest, steht es da aber noch:
javadoc hat gesagt.:
listFiles

public File[] listFiles()

Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname.

If this abstract pathname does not denote a directory, then this method returns null. Otherwise an array of File objects is returned, one for each file or directory in the directory. Pathnames denoting the directory itself and the directory's parent directory are not included in the result. Each resulting abstract pathname is constructed from this abstract pathname using the File(File, String) constructor. Therefore if this pathname is absolute then each resulting pathname is absolute; if this pathname is relative then each resulting pathname will be relative to the same directory.

There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.

Returns:
An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.
Throws:
SecurityException - If a security manager exists and its SecurityManager.checkRead(java.lang.String) method denies read access to the directory
Since:
1.2
 

Murray

Top Contributor
HoaX hat gesagt.:
naja, verzeichnisse sind ja nur spezielle dateien ... ;)
Natürlich, aber trotzdem kann es schon verwirren, wenn in der Doku bei der einen Methode zwischen beiden unterschieden wird und bei der anderen nicht - zumal es in der Klasse File ja auch die Methoden isFile und isDirectory gibt, die ja doch wieder implizieren, dass "file" hier nicht immer als der gemeinsame Oberbegriff gemeint ist.

Aber die Klasse File kann ja wohl ohnehin nicht als Musterbeispiel für orthogonales Library-Design durchgehen...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M File.isDirectory() Allgemeine Java-Themen 7
H "File too large" - genauere IOException-Behandlung Allgemeine Java-Themen 5
H Sicherer File Tresor Allgemeine Java-Themen 13
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
G Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Jar-File soll eignen *.jar Namen ausgeben Allgemeine Java-Themen 10
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
V ProcessBuilder exe file Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben