JAVA: Filesystem zu langsam beim umbenennen von Files

Hey Leute,

ich hab ein sehr blödes Problem. Vorab mal ein Beispielcode:
Code:
import java.io.File;

public class MoveTest {

	public static void main(String[] args) {

		File folder = new File("C:/test/testfolder");

		while(true)
		{
			File renameTo = new File("C:/test/testfolder-changed");
			folder.renameTo(renameTo);
			File toTest = new File("C:/test/testfolder");
			if(toTest.exists())
			{
				System.out.println("Immer noch da");
			}
			renameTo.renameTo(folder);
		}
	}
}

Der Beispielcode stellt mein Problem etwas überspitzt dar. Das toTest.exists() sollte eigentlich nie true sein, ist es aber doch ab und zu. Kennt jemand eine Lösung mit der man das renameTo machen kann und auch gewartet wird, bis das wirklich am Filesystem angekommen ist?
Irgendwelche Thread.sleep()-Lösungen sind nicht das wahre. Das ganze soll ja möglichst Performant bleiben.

Gruß odigo
 
Servus,

in Java gibt es generell drei Möglichkeiten mit Streams zu arbeiten
- benutzung des io-Package. Dies ist jedoch "etwas langsam", stellt aber eine komfortable Lösung dar
- das nio-Packet. Dieses Paket wurde auf Schnelligkeit getrimmt, ist aber etwas komplexer zu Bedienen
- schreiben einer eigene C-Bibliothek :D

Zu deinem Codebeispiel sei noch gesagt, dass du niemals folgende Reihenfolge verwenden solltest
Code:
 File f = ...if(f.exist()) { // dann mache folgendes}
Zwischen dem Überprüfungsbefehl und den eigentlichen Dateizugriff liegt eine gewisse Zeitspanne. Diese kann z.B. ein Hacker nutzen, um z.B. die URL umzubiegen. Und schon haben wir eine rießige Sicherheitslücke. Abhilfe bringt z.B. das Erzwingen und Abfangen einer Exception falls die Datei nicht existiert ;)
 
Also bei deiner Anmerkung bezüglich der Sicherheitslücke kann ich dir nicht ganz Folgen. Wennst willst kannst das ja noch näher ausführen. Mein Problem ist aber eh nur in einem Programm aufgetreten, was nur von mir und ein paar Kollegen verwendet wird. Ich glaub kaum, daß einer von denen irgendwie das Programm manipulieren will :D

Ich glaub mir ist selbst eine Lösung eingefallen:

Code:
import java.io.File;

public class MoveTest {

	public static void main(String[] args) {

		File folder = new File("C:/test/testfolder");

		while(true)
		{
			File renameTo = new File("C:/test/testfolder-changed");
			folder.renameTo(renameTo);
			while(!renameTo.exists())
			{
				try {
					Thread.currentThread().sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
                        File toTest = new File("C:/test/testfolder");
			if(toTest.exists())
			{
				System.out.println("Immer noch da");
			}
			renameTo.renameTo(folder);
		}
	}
}

Ich denke so in etwa könnts gehen. Natürlich nur schematisch dargestellt. Der try-catch-Block passt so natürlich nicht :D Werd ich morgen mal ausprobieren.

Gruß odigo
 
Servus,

wenn du weiterhin mit io arbeiten möchtest musst du dir klar werden, wann eine rename-Operation fehlschlägt. File.renameTo schlägt fehl, wenn z.B. keine Schreibrechte vorhanden sind oder die Datei/Ordner bereits besteht!

Code:
import java.io.File;

public class MoveTest {

public static void main(String[] args) {

File folder = new File("C:/test/testfolder");

while(true)
{
File renameTo = new File("C:/test/testfolder-changed");
boolean res = folder.renameTo(renameTo);

if(! res)
{
System.out.println("Immer noch da");
}

renameTo.renameTo(folder);
}
}
}
 
Fehlschlagen in dem Sinne tuts ja nicht. Der Ordner wird ja umbenannt. Die Sache ist nur die, daß dieses Umbenennen je nach Last auf der Festplatte ein ganz kurzes Weilchen dauert in der es anscheinend möglich ist den umbenannten Ordner nochmal mit altem Namen zu lesen und das muss ich verhindern.

Gruß odigo

Edit: Nach langem rumprobieren und debuggen hat sich herausgestellt, daß es in meinem Fall nicht nur an der Geschwindigkeit des Filesystems liegt, sondern auch daß das renameTo() teilweise aus vollkommen ungeklärten Gründen nicht gehen will. Ich hab mir jetzt einfach eine Helferklasse geschrieben mit der ich die Ordner auf herkömmliche Weise umbenenne, also neuen Ordner erstellen, Files kopieren, alten Ordner löschen. So sollte es auf alle Fälle gehen. Die Methode renameTo ist wohl von Haus aus etwas buggy, zumindest gibt es laut Google viele die da mysteriöse Probleme haben.
 
Zurück
Oben