Variablen IO Exception weil File angeblich nicht exisitert

Loooki

Mitglied
Hey,

Ich bekomme eine IO (File not found) Exception wenn ich auf eine Datei mit "Sonderzeichen" zugreifen möchte.

Zeichen wie: Unicode Character 'LATIN CAPITAL LETTER U WITH ACUTE' (U+00DA)
(Es können glaube ich wohl auch bestimmte Kombinationen von Punkten sein(?))

Beispielcode:

Java:
	@Override
	public FileVisitResult visitFile(Path pathFile, BasicFileAttributes attrs) throws IOException {
		System.out.println(pathFile.toFile().exists());
		return FileVisitResult.CONTINUE;
	}

die Methode visitFile wird überschrieben vom SimpleFileVisitor<Path>. (JDK 7)

das witzige daran ist ja eigentlich das in der Variable pathFile der richtige Pfad drinn steht.
Wandle ich das dann in ein File um und frage obs überhaupt exisitert gibt es ein false zurück.

die oben genannte IO Exception würde also auftreten bei der weiteren verarbeitung des Files.

Ich verwende das Oracle JDK 7 Update 4 unter Mac OS X (Ja, es ist immernoch die Beta)
Habs mir bevor ich diesen Thread erstellt hab auch nochmal runtergeladen wegen eventuellen Updates.
 
Dateien oder Ordner mit Sonderzeichen sind generell ne schlechte Idee, das sollte man immer vermeiden.
Wobei das bei mir (Ubuntu) mit dem
Code:
Ú
im Namen funktioniert:
Java:
String path = System.getProperty("user.home") + "/TestÚ";
File file = new File(path);
System.out.println(file.exists()); // prints true
Bist du dir ganz sicher dass der Pfad passt?
 
Ja, 100% tig passt der Pfad.

Natürlich sind solche Zeichen in Dateinamen nicht gerade gut aber das gebe ich in diesem fall nicht vor.

Java:
 public class Test {
	public static void main(String[] args) {
		System.out.println(System.getProperty("java.version"));
		File file = new File("/Users/Zarathustra/test/testtest2/Úhallo.mp3");
		System.out.println(file.exists());
	}
}

Output:
Code:
1.7.0_04-ea
false

bzw:
Code:
1.6.0_26
true

Mit anderen Worten JDK im Eimer....
 
Das scheint tatsächlich wohl am JDK zu liegen. Bei mir funktionierts sowohl mit Java6 und Java7:
Code:
1.6.0_23
/home/eike/TestÚ
exists: true
Code:
1.7.0_147-icedtea
/home/eike/TestÚ
exists: true
 
Dann schreib ich denen mal nen Ticket 😉

Idee für nen Workaround?
Vorher die Datei umbenennen scheint mir irgendwie blöd außerdem sollte der Name schon beibehalten werden...

Und selbst wenn umbennen nach welchem Muster erkenne ich denn solche Datein...

newFile(path.toUri()); - funktioniert übrigens auch nicht
 
Idee für nen Workaround?

Läuft denn der Visitor durch? Welche Operationen sollen auf der Datei durchgeführt werden?

Vorher die Datei umbenennen scheint mir irgendwie blöd außerdem sollte der Name schon beibehalten werden...

Klappt umbennenen denn überhaupt? Natürlich kannst Du ggfs. die Datei am Ende wieder zurückbennenen.

Und selbst wenn umbennen nach welchem Muster erkenne ich denn solche Datein...

Für den Anfang würde ich so etwas versuchen:
Java:
      for(int i = 0; i < str.length(); i++) 
      {
         char ch = str.charAt(i);
         if(ch > 127)
             // Zeichen ausserhalb ASCII Range => Do Something!
      }
 
hilft es, ins Verzeichnis zu wechseln, sich alle Dateinamen darin anzuschauen,
und, falls die gesuchte Datei mit ähnlichem Namen dabei ist, zu vergleichen?
 
Läuft denn der Visitor durch? Welche Operationen sollen auf der Datei durchgeführt werden?



Klappt umbennenen denn überhaupt? Natürlich kannst Du ggfs. die Datei am Ende wieder zurückbennenen.



Für den Anfang würde ich so etwas versuchen:
Java:
      for(int i = 0; i < str.length(); i++) 
      {
         char ch = str.charAt(i);
         if(ch > 127)
             // Zeichen ausserhalb ASCII Range => Do Something!
      }

@Cybergoth Stimmt umbennen sollte auch nicht funktionieren.

Das mit Char > 127 klingt aber interessant.

@SlaterB zu vergleichen womit?
 
na mit dem gegebenen Namen,
"TestÚ" wird im Verzeichnis X nicht gefunden, aber vielleicht ist unter den Dateien im Verzeichnis "Test?" oder so,
was dann hinreichend dasselbe ist,

falls du die Dateien auf diesem Wege findes und nach und nach erkennst, welches Zeichen durch welches andere ersetzt wird,
kannst du auch andersrum im gegebenen Namen die Zeichen ersetzen, dann wirds vielleicht direkt gefunden
 

Zurück
Oben