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:
Die Methode geht noch weiter, aber ich seh schon hier an der Ausgabe, das was nicht stimmt:
Das ist schon mal glatt gelogen:
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:
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:
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:
OS:
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