sicheres Löschen von Dateien

Status
Nicht offen für weitere Antworten.

Thogo

Mitglied
Hallo,

ich möchte ein Verzeichnis löschen, in dem Dateien enthalten sind.

Randbedingung: Ist eine Datei schreibgeschützt oder von einer anderen Anwendung geöffnet soll die Routine mit einer Fehlermeldung abbrechen.

Folgende Lösung habe ich bisher:

Code:
  boolean rmdir(File f) {
    boolean flag = true;
    if (!f.exists()) return false;
    if (f.isDirectory()) {
      File filelist[] = f.listFiles();
      for (int i = 0; i < filelist.length && flag; i++)
        flag &= rmdir(filelist[i]);
    }
    if (!f.canWrite())
      return false;
    return (flag && f.delete());
   }


Ist die Datei schreibgeschützt, bekomme ich tatsächlich dank canWrite() ein False zurück.
Ist die Datei von einer anderen Anwendung geöffnet, wird die Datei trotzdem gelöscht.
Interessanterweise bricht die Routine beim Löschen des Verzeichnisses trotzdem ab.

Wie kann ich das Löschen von anderweitig geöffneten Dateien verhindern?
Wie frägt man das ab?

Gruß
_____
/hogo
 

Leroy42

Top Contributor
Thogo hat gesagt.:
Ist die Datei von einer anderen Anwendung geöffnet, wird die Datei trotzdem gelöscht

Das glaube ich jetzt weniger; das BS wird das sicher verhindern.

Und das die Routine abbricht ist doch genau was du wolltest, weil
f.delete() eben false liefert.

BTW: Ein boolean flag zu nennen ist irgendwie sinnbefreit :autsch:

Gib ihm doch einen passenden Namen wie canDelete oder einfach ok oder ...
 

Jockel

Top Contributor
@Leroy:
Unter Windows mal eine Datei mit Notepad öffnen und dann versuchen besagte Datei zu löschen... Funktioniert wunderbar.
 

Thogo

Mitglied
Leroy42 hat gesagt.:
Thogo hat gesagt.:
Ist die Datei von einer anderen Anwendung geöffnet, wird die Datei trotzdem gelöscht

Das glaube ich jetzt weniger; das BS wird das sicher verhindern.

Dann probier's mal aus. Ich dachte das auch zuerst.
Einfach mal eine Textdatei mit Notepad o.ä. öffnen...

Leroy42 hat gesagt.:
BTW: Ein boolean flag zu nennen ist irgendwie sinnbefreit :autsch:

Gib ihm doch einen passenden Namen wie canDelete oder einfach ok oder ...

Naja, bei einer so kurzen Routine. Der Nutzen ist ohnehin nur begrenzt. Es bewirkt nur, dass im Fehlerfall die Rekursion schneller abgebrochen wird.

Gruß
_____
/hogo

Edit:
Ich habe es unter Windows 2000 mit jsdk 1.4.2_11 probiert.
 

meez

Top Contributor
Leroy42 hat gesagt.:
Thogo hat gesagt.:
Ist die Datei von einer anderen Anwendung geöffnet, wird die Datei trotzdem gelöscht
Das glaube ich jetzt weniger; das BS wird das sicher verhindern.

Ich stimm dir zu und nicht ;)...Kommt immer ein wenig drauf an...unter Unix kein Problem zu löschen...Unter Windows z.T. kommt schlussendlich auf die FileHandler des OS an..Und da liegt auch grad das Problem...Mit Java kommt man nicht an die ran, und kann deshalb auch kaum rausfinden, ob die Datei schon verwendet wird... :cry:
 

Illuvatar

Top Contributor
Thogo hat gesagt.:
Leroy42 hat gesagt.:
Thogo hat gesagt.:
Ist die Datei von einer anderen Anwendung geöffnet, wird die Datei trotzdem gelöscht

Das glaube ich jetzt weniger; das BS wird das sicher verhindern.

Dann probier's mal aus. Ich dachte das auch zuerst.
Einfach mal eine Textdatei mit Notepad o.ä. öffnen...

Notepad hält auch keinen Lock oder so auf die Datei...
 

Leroy42

Top Contributor
Jockel hat gesagt.:
@Leroy:
Unter Windows mal eine Datei mit Notepad öffnen und dann versuchen besagte Datei zu löschen... Funktioniert wunderbar.

Das hat doch nichts mit dem BS zu tun. Es ist einfach so, daß Textpad zwar überwacht ob die Datei verändert
wurde, die Datei selbst jedoch nicht lockt. Das finde ich auch angenehmer so. Du kannst allerdings nicht das
Arbeitsverzeichnis Textpad's löschen.

Das Locking wir vom BS (auf Anforderung der Anwendung) gemacht, ist also nicht von Java
aus direkt erreichbar.

Edit: Uuuppss. Illuvator war schneller. Sollte beim Erstellen eines Posts lieber nicht telefonieren :oops:
 

Thogo

Mitglied
Illuvatar hat gesagt.:
Thogo hat gesagt.:
Leroy42 hat gesagt.:
Thogo hat gesagt.:
Ist die Datei von einer anderen Anwendung geöffnet, wird die Datei trotzdem gelöscht

Das glaube ich jetzt weniger; das BS wird das sicher verhindern.

Dann probier's mal aus. Ich dachte das auch zuerst.
Einfach mal eine Textdatei mit Notepad o.ä. öffnen...

Notepad hält auch keinen Lock oder so auf die Datei...

Hm, folgendes Szenario:

Man lege eine Verzeichnis an.
Erstelle dort eine Textdatei und öffne sie mit dem Notepad.
Dann versuche man das Verzeichnis im Datei-Explorer zu löschen.

Damit erhält man die Fehlermeldung, dass eine Zugriffsverletzung
aufgetreten ist, da die Zieldatei geöffnet ist.

Ich interpretiere das durchaus so, dass Notepad einen Lock auf
die Datei hält.

Und genau das will ich mit meiner Anwendung auch erreichen.
Dazu muß ich eben abfragen, ob jemand die Datei offen hat.

Aber wenn alle der Meinung sind, dass man den Mechanismus
von Java aus nicht erreichen kann, muss ich halt die Kröte
schlucken.

Gruß
_____
/hogo
 

Illuvatar

Top Contributor
Hm das ist interessant den Ordner kann man nicht löschen, die Datei aber schon 0o

Also wenn es eine wirklich gelockte Datei gibt, kannst du die auch mit Java nicht löschen. Das mit Notepad ist schon komisch, aber nicht nur mit Java ;)
 

Leroy42

Top Contributor
Illuvatar hat gesagt.:
Hm das ist interessant den Ordner kann man nicht löschen, die Datei aber schon 0o
Genau.
Thogo hat gesagt.:
Ich interpretiere das durchaus so, dass Notepad einen Lock auf
die Datei hält.
Eben nicht ganz. Die Datei ist vermutlich nicht gelockt. Nur die Anwendung Notepad
hat als Arbeitsverzeichnis das gesetzt in der die Datei liegt. Windows verhindert also nur
das Löschen dieses Arbeitsverzeichnisses um seinen Freund Notepad nicht zu verwirren;

Die Programmierer von M$ kennen halt die Programmierqualitäten ihrer Kollegen :cool:
 

Thogo

Mitglied
Leroy42 hat gesagt.:
Die Programmierer von M$ kennen halt die Programmierqualitäten ihrer Kollegen :cool:

Die wissen warum. :)

Ok, stimmt Notepad ist ein schlechtes Beispiel!
Und verhält sich tatsächlich wie Java.

Nehmen wir MS-Word. Der hält einen Lock und die Datei selbst kann ich nicht löschen.
Wie schafft man das in Java?
(Ja es wurde schon geschrieben, dass das wohl zu BS-nah ist. Hat trotzdem jemand 'ne Idee?)

Gruß
_____
/hogo
 

Thogo

Mitglied
Uups, Notepad war ja ein ganz schlechtes Beispiel!

Wenn Word einen Lock drauf hält, schafft die Java RT es NICHT die Datei zu löschen.
Dann halte ich ja meine Spezifikation ein ohne es zu wissen...

Danke für das Feedback!

Code funktioniert, nur die Testbedingungen waren schlecht.

Gruß
_____
/hogo
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
D sicheres hardgecodetes passwort? Allgemeine Java-Themen 18
M löschen in Rot Schwarz Bäumen Allgemeine Java-Themen 6
M lineare Sondierung löschen Allgemeine Java-Themen 2
E Varialbe komplett Löschen Allgemeine Java-Themen 26
O Warum kann ich so keine Elemente löschen und erhalte einen IllegalStateException? Allgemeine Java-Themen 4
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
glamdring273 Discord JDA, Kanal löschen Allgemeine Java-Themen 0
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
J Datei löschen, die Leerzeichen im Pfad hat Allgemeine Java-Themen 5
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
A Referenzen von Bildobjekten löschen Allgemeine Java-Themen 0
I PDF freigeben zum löschen Allgemeine Java-Themen 4
P Löschen eines keys in einer SortedMap Allgemeine Java-Themen 5
P JDK installieren Kann man die Ordner in C:\Users\*\AppData\LocalLow\Sun\Java\.... löschen? Allgemeine Java-Themen 3
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
G Datei löschen Allgemeine Java-Themen 8
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
L Doppelte eintraege im Stringbuffer löschen Allgemeine Java-Themen 4
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
M lucene suchen/löschen/hinzufügen Allgemeine Java-Themen 4
R Leere Verzeichnisse löschen Allgemeine Java-Themen 11
S Speichern/Laden/Hinzufügen/Löschen der Array-Wörter; unerwartete Ausgabe Allgemeine Java-Themen 6
V System.out.println an jeder Stelle im Projekt löschen Allgemeine Java-Themen 4
M Batch zum Java Cache löschen Allgemeine Java-Themen 3
R Löschen von Files nicht möglich Allgemeine Java-Themen 11
KrokoDiehl Verzeichnisse via FileVisitor löschen Allgemeine Java-Themen 3
V Objekt löschen Allgemeine Java-Themen 7
127.0.0.1 StringBuffer leere Zeile löschen Allgemeine Java-Themen 8
J char-Array löschen Allgemeine Java-Themen 5
W n:m Beziehung Referenzen löschen Allgemeine Java-Themen 5
127.0.0.1 Zeilen in .txt Datei löschen Allgemeine Java-Themen 11
D Löschen-Methode im Stapelverarbeitungsprogramm Allgemeine Java-Themen 4
S JTable und Spalten löschen Frage Allgemeine Java-Themen 5
EnHancEd[] ArrayList gezielt löschen Allgemeine Java-Themen 9
S Nullen aus Array löschen Allgemeine Java-Themen 10
N Java lässt sich nicht löschen! Allgemeine Java-Themen 7
U Wie kann mit einen Java Applet Dateien erstellen,verschieben und löschen? Allgemeine Java-Themen 9
P Input/Output Ordner löschen --> geht nicht Datei --> Ja Allgemeine Java-Themen 6
K Leerzeiilen aus ArrayList löschen?! Allgemeine Java-Themen 7
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
S Singleton Instanz löschen Allgemeine Java-Themen 5
Z Ausschneiden, Kopieren, Einfügen, Löschen in JTextArea Allgemeine Java-Themen 5
K Java Feld Duplikate löschen Allgemeine Java-Themen 5
F SAXBuilder blockiert löschen von Dateien Allgemeine Java-Themen 2
L Datei sicher löschen/mehrfach überschreiben? Allgemeine Java-Themen 2
S Java komplett löschen und neu installieren Allgemeine Java-Themen 4
N Java geht nicht mehr zu löschen Allgemeine Java-Themen 5
E Regex alles nach ? löschen Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
W 2D-Grafik nach getthumbnail läst sich Quellbild nicht mehr löschen Allgemeine Java-Themen 3
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
S Zeilen in einer Datei löschen Allgemeine Java-Themen 3
Z aus private List<???> list eintrag löschen Allgemeine Java-Themen 4
C Zeile aus einer CSV-Datei löschen Allgemeine Java-Themen 3
J Element aus HashSet löschen Allgemeine Java-Themen 2
S Element aus ArrayListe löschen --> Thread hängt sich auf Allgemeine Java-Themen 2
A LinkedList Auslesen und Objekt Löschen Allgemeine Java-Themen 4
G Mit Batch-Datei verzeichnisse löschen Allgemeine Java-Themen 9
K von List getSelected auf ResultSet Datenbank löschen Allgemeine Java-Themen 2
S Reihen aus einem 2-dim. Array 'löschen' Allgemeine Java-Themen 2
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
A Zeilen aus einer Textdatei löschen Allgemeine Java-Themen 6
M Arraylist - Inhalte in Textferldern anzeigen, verändern und löschen. Allgemeine Java-Themen 18
S Liste Object Löschen Allgemeine Java-Themen 7
G Log4J - Logs älter als 3 Tage löschen Allgemeine Java-Themen 5
Quaxli Files massenhaft löschen Allgemeine Java-Themen 3
J Mit POI Zeile in Excel löschen Allgemeine Java-Themen 5
D Kann Tiff Datei nicht löschen Allgemeine Java-Themen 12
0x7F800000 Regex zum löschen vom unnötigen whitespace Allgemeine Java-Themen 4
Daniel_L Best Practice zum Löschen von Log-Files? Allgemeine Java-Themen 8
S Problem beim Löschen des Inhalts des Fensters Allgemeine Java-Themen 4
O Zeile eines Textfiles löschen Allgemeine Java-Themen 2
O File zum löschen "schließen" Allgemeine Java-Themen 2
G JTree Node löschen Allgemeine Java-Themen 2
C String to hex und hex-Werte löschen Allgemeine Java-Themen 2
H Benutzerkonto löschen Allgemeine Java-Themen 4
G Dateien löschen Allgemeine Java-Themen 3
G Datei löschen nach kopieren geht nicht Allgemeine Java-Themen 5
G List- Einträge löschen Allgemeine Java-Themen 3
T probleme mit file löschen Allgemeine Java-Themen 9
F Aus einer XML Datei löschen Allgemeine Java-Themen 3
M Endgültiges Löschen von Objekten Allgemeine Java-Themen 7
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
Z Letztes zeichen eines strings löschen Allgemeine Java-Themen 3
S Löschen von Objekt erzwingen Allgemeine Java-Themen 4
T LDAP - Eintrag löschen Allgemeine Java-Themen 6
J Alte Log Files löschen mit log4j Allgemeine Java-Themen 3
C StyledDocument: SimpleAttributeSets löschen? Allgemeine Java-Themen 2
P löschen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben