File.delete erfolgreich obwohl Datei geöffnet ist.

jForumUser

Neues Mitglied
Hallo Forum,

obwohl ich eine Datei in Windows geöffnet habe - bspw. eine Textdatei - ist Java in der Lage diese zu löschen. Wie kann ich das denn unterbinden?? Leider finde ich nur Beiträge zu Codes die Dateien nicht löschen können :autsch:.

Anbei ein auf das Wesentliche gekürzter Code, der die Datei "C:\TA\LIMS\A.txt" löscht, auch wenn sie bspw. in Word Pad oder dem Windows Editor geöffnet ist.

Java:
public class FileHandling {
    
    public static void main(String[] args) throws IOException{
        FileHandling fh = new FileHandling();
        File f = new File("C:\\TA\\LIMS\\A.txt");
        fh.deleteFile(f);
    }
    
    boolean deleteFile (File fileName){

        try {
            boolean delete;
            delete = fileName.delete();
            System.out.println("gelöscht? + " + delete);
        } catch (Exception e) {
            System.out.println("fehkler: " + e); 
        }
        
        return false;
    }
}

Umgebung: Windows 8 x64, Java SE 1.7.0_51, NetBeans IDE 7.4

Über einen Wink, Link oder einen verständlichen Tipp wäre ich sehr dankbar.
Schönes WE allen...
 
Mit welchem Programm war denn die Datei geöffnet? Das Notepad z.B. liest die Datei ein und schließt dann das File-Handle wieder, Notepad++ ebenfalls (und so machen das einige Programme).

Eine Datei, die in deinem Java-Programm geöffnet ist "unlöschbar" oder "unschreibbar" zu machen geht nur, indem du nach dem einlesen der Daten den FileInputStream nicht schließt.
 
Schau mal hier
Die 3. Antwort könnte etwas für dich sein.
DIe Idee dahinter ist recht simpel. Wenn du nicht willst, dass eine geöffnete Datei gelöscht wird, überprüfe zunächst irgendwie ob die Datei geöffnet ist. Die 3. Antwort in dem Beitrag scheint für Textdateien zu funktionieren, probiers einfach mal aus
 
Moin und besten Dank für eure Tipps.
Leider hat mich meine Umsetzung eurer Tipps dem Ziel noch nicht näher gebracht.

@Tobse: Geöffnet mit MS Editor und WordPad (z.T. sogar gleichzeitig).

Sobald ich eine Datei - völlig losgelöst von Java - in einem Windows Programm öffne (bspw. eine emf-Datei in MS Paint oder eine txt-Datei in MS Editor), kann ich sie mit Java anschließend bedingungslos löschen, umbenennen, reservieren usw..

Seht selbst:

Java:
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Files;

public class FileHandling2 {
    
    public static void main(String[] args) throws IOException{       
        //Datei f wird vor Programmstart in Paint geöffnet
        File f = new File("C:\\TA\\LIMS\\A.emf");
        
        //Test 1 Schreibzugriff mit File Channel prüfen
        FileChannel fc = new RandomAccessFile(f, "rw").getChannel();
        FileLock lock = fc.tryLock();
        if (lock == null){
            System.out.println(f + " ist bereits geöffnet");
        }else{
            System.out.println(f + " ist nicht geöffnet");
        }
        lock.release();
        fc.close();
        
        // Test 2 Schreibzugriff abfragen
        boolean writable = Files.isWritable((f.toPath()));
        System.out.println(f + " beschreibbar? " + writable);
        
        // Test 3 Umbenennen
        boolean canRename = f.renameTo(new File(f.toString().replace("A.emf", "B.emf")));
        System.out.println(f + " umbenennbar? "  + canRename);

        // Test 4 Löschen --> vorher Test 3 auskommentieren
        try{
            Files.delete(f.toPath());
        }  catch(IOException e){
            System.out.println("Hat mich etas vom Löschen abgehalten?" + e);
        }
    }
}

Ergebnis:

C:\TA\LIMS\A.emf ist nicht geöffnet
C:\TA\LIMS\A.emf beschreibbar? true
C:\TA\LIMS\A.emf umbenennbar? true
Hat mich etas vom Löschen abgehalten?java.nio.file.NoSuchFileException: C:\TA\LIMS\A.emf

Fällt euch noch eine Möglichkeit ein, wie man in Java überprüfen kann, ob eine ausgewählte Datei in diesem Augenblick geöffnet ist?

Besten Dank!
 
Zuletzt bearbeitet:

Zurück
Oben