File#delete() unter Linux und Windows
Geschrieben von Olaf Willuhn am
Gegeben sei folgender Test-Code mit dem Fehler, dass ein File#delete() ausgeführt wird, obwohl der OutputStream noch offen ist.
Interessant hierbei ist weniger der Fehler im Code sondern die Tatsache, dass es sich bei Windows und Linux unterschiedlich auswirkt:
Windows:
Linux:
Sprich: Bei Windows wird die Datei nicht gelöscht, wenn noch ein OutputStream offen ist, bei Linux jedoch schon. Ich will lieber nicht wissen, ob dieses Verhalten vielleicht sogar noch abhängig von verwendetem Filesystem, glibc, Kernel oder Java-Version ist ;)
import java.io.*;
public class Test
{
public static void main(String[] args) throws Exception
{
File f = new File("test.txt");
OutputStream os = null;
try
{
os = new FileOutputStream(f);
os.write("foo".getBytes());
System.out.println("File#delete() liefert: " + f.delete());
System.out.println("File#exists() liefert: " + f.exists());
}
finally
{
if (os != null)
os.close();
}
}
}
Interessant hierbei ist weniger der Fehler im Code sondern die Tatsache, dass es sich bei Windows und Linux unterschiedlich auswirkt:
Windows:
D:\test> java Test
File#delete() liefert: false
File#exists() liefert: true
Linux:
$~>java Test
File#delete() liefert: true
File#exists() liefert: false
Sprich: Bei Windows wird die Datei nicht gelöscht, wenn noch ein OutputStream offen ist, bei Linux jedoch schon. Ich will lieber nicht wissen, ob dieses Verhalten vielleicht sogar noch abhängig von verwendetem Filesystem, glibc, Kernel oder Java-Version ist ;)
Trackbacks
Trackback-URL für diesen EintragDieser Link ist nicht aktiv. Er enthält die Trackback-URI zu diesem Eintrag. Sie können diese URI benutzen, um Ping- und Trackbacks von Ihrem eigenen Blog zu diesem Eintrag zu schicken. Um den Link zu kopieren, klicken Sie ihn mit der rechten Maustaste an und wählen "Verknüpfung kopieren" im Internet Explorer oder "Linkadresse kopieren" in Mozilla/Firefox.
Keine Trackbacks
Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.
Kommentare
Ansicht der Kommentare: Linear | VerschachteltDominik am :
ist unter linux prinzipiell immer so das du Dateien löschen kannst die im Moment geöffnet sind. Richtig heiter wird es erst wenn du versuchst unter Linux auf einer Samba-Freigabe von Windows etwas zu löschen was auf einem Windows-PC im Moment noch geöffnet ist.
Problemlos kannst du dagegen den kompletten XServer löschen während er läuft, dabei wirst du keine Fehlermeldungen zu gesicht bekommen (erst danach, später *G*)
Gruß
Dominik
Olaf am :
Daher entsprach auch das Verhalten der Java-Klasse unter Linux eher dem, was ich erwartet hab. Im konkreten Fall hatten sich in einem Spool-Verzeichnis Dateien angesammelt, die nach der Abarbeitung eigentlich hätten gelöscht werden sollen. Unter Windows blieben sie aber wegen eines noch offenen OutputStreams liegen.