file.delete funktioniert nicht

apa13179

Mitglied
Hallo,
ich suche mit meinem Code Messwertdateien, die ich auslese und in eine DB schreibe. Danach möchte ich die gefundene Datei löschen. Leider wird nicht immer jede Datei gelöscht.

Vielleicht habt ihr ne Idee 🙂

Mein Code:

Java:
public static isOK find(String start, String extensionPattern, isOK ISOK) throws ParseException, SQLException, IOException {
 List<File> files = new ArrayList<>(1024);
 Stack<File> dirs = new Stack<>();
 File startdir = new File(start);
 Pattern p = Pattern.compile(extensionPattern, Pattern.CASE_INSENSITIVE);
 if (startdir.isDirectory()) {
  dirs.push(startdir);
 }
 while (dirs.size() > 0) {
  for (File file: dirs.pop().listFiles()) {
   if (file.isDirectory()) {
    dirs.push(file);
   } else if (p.matcher(file.getName()).matches()) {
    files.add(file);
    ISOK.setFile(file.toString());
    FileHandler.fileToSplit(file, ISOK);
   }
  }
 }
 System.out.println("Size List files " + files.size());
 if (files.size() > 0) {
  System.out.println("Yes");
  for (int i = 1; i < files.size(); i++) {
   System.out.println("lösche: " + files.get(i));
   deleteFile(files.get(i));
  }
 }
 return ISOK;
}
public static void deleteFile(File f) throws IOException, SQLException {
 try {
  boolean result = f.delete();
  if (result) {
   ConnectDB.getWriteLog("FileConverter", "Datei gelöscht " + f.toString());
   f = null;
  } else {
   ConnectDB.getWriteLog("FileConverter", "Datei nicht gelöscht " + f.toString());
  }
 } catch (Exception e) {
  ConnectDB.getWriteLog("FileConverter", "Exception deleteFile " + f.toString() + "Ex = " + e.toString());
 }
}
 
Zuletzt bearbeitet von einem Moderator:
Er will ja nur spezifische Files löschen, nicht einen Ordner + ganzen Inhalt.
Das sollte mit dem Code eigentlich funktionieren. Sicher das die Datei von nicht mehr verwendet wird? Offener Stream aus deinem Program? Ein anderer Prozess der auf die Datei zugreift?
 
Danke für die Antworten.

Richtig ich möchte nur die spezifischen Filles löschen.
Offener Stream kann nicht sein, da ich keinen Reader o.ä. aufmache.
Die Dateien werden von einer Steuerungen geschrieben und von niemanden benutzt.
 
Geh doch einfach mal Schrit für Schritt durch deinen Code. Für mich macht der so gar keinen Sinn. Du schaust ob das erste File ein Dir ist. Wenn ja packst du es in ein Array. Als nächstes schaust du ob das Array mit den Dirs einen Inhalt hat. Wenn nicht, dann machst du auch nicht. Wo liegt da der sinn. Wenn ja, dann holst du das eine Dir wieder raus, wozu? ist ja immer noch das startFile!. Dann gehst du durch das dir und wenn es ein passendes file ist packst du es in das file array und wenn es ein dir ist in das dir array. Warum? Du benutzt das dir array danach nie wieder!.

Wenn du auch Files in den Unterorndern löschen willst, must du rekursiv arbeiten. Machst du aber nicht.

Gruß

Claus
 
Wenn du auch Files in den Unterorndern löschen willst, must du rekursiv arbeiten. Machst du aber nicht.
Muss nicht rekursiv gelöst werden, kann auch so wie hier in diesem Fall iterativ sein!

Geh doch einfach mal Schrit für Schritt durch deinen Code. Für mich macht der so gar keinen Sinn.
Sehen wir unterschiedlichen Code? Er gibt sein erstes File in einen Stack (sofern es sich um ein Directory handelt).
Danach geht er (iterativ) seine Ordnerstruktur durch, alle Dictionaries werden dem Stack hinzugefügt und Files dessen Namen passen, werden in eine extra Liste geschrieben.

Diese Files sollen gelöscht werden, was aber nicht bei allen funktioniert.
 
Danke für die Antworten.

Richtig ich möchte nur die spezifischen Filles löschen.
Offener Stream kann nicht sein, da ich keinen Reader o.ä. aufmache.
Die Dateien werden von einer Steuerungen geschrieben und von niemanden benutzt.

Wie liest du die Dateien denn ein?
Das klingt am ehesten danach, dass irgendein Prozess (uU deiner durch das Einlesen) noch ein lock auf die Datei hat...

Du könntest es mal mit Files.delete versuchen, da sollte eine Exception mit Grund geworfen werden, wenn es nicht klappt.
 
Hallo,
danke für die Antworten.

Wie liest du die Dateien denn ein?
Das klingt am ehesten danach, dass irgendein Prozess (uU deiner durch das Einlesen) noch ein lock auf die Datei hat...

Die dateien kann ich jederzeit im Betriebssystem löschen, deshalb nehme ich an, dass sie nicht durch einen anderen Prozess o.ä. gelockt sind.

Du könntest es mal mit Files.delete versuchen, da sollte eine Exception mit Grund geworfen werden, wenn es nicht klappt.

files.delete bringt keine Exception nur das File ist danach noch vorhanden 😵

Ich hatte vermutet, dass die Dateien durch meinen eigenes Programm gelockt sind. Das kann ich auch ausschliessen.

Hat jemand vielleicht noch ne Idee????
 
Die dateien kann ich jederzeit im Betriebssystem löschen, deshalb nehme ich an, dass sie nicht durch einen anderen Prozess o.ä. gelockt sind.

Ich hatte vermutet, dass die Dateien durch meinen eigenes Programm gelockt sind. Das kann ich auch ausschliessen.

Sprich während dein Programm läuft und probiert hat die Files zu löschen, könntest du über den Dateimanager die Dateien ohne Probleme löschen?
 
Oben hast du geschrieben das du ausschließen kannst das dein Programm die Dateien lockt 😉
Daher dachte ich mir hast du ausprobiert die Dateien während dein Programm läuft zu löschen.

EDIT: Es gibt auch Tools welche dir anzeigen können welche Prozesse Zugriff auf eine Datei haben.
 
Ist es immer eine Datei, die auch noch die erste Datei in der Liste ist?
Dann liegt's an deiner for-Schleife, die bei 1 statt 0 startet, oder ist das schon gefixt?
 
Dann liegt's an deiner for-Schleife, die bei 1 statt 0 startet, oder ist das schon gefixt?
Ja, das hatte ich schon behoben.

Oben hast du geschrieben das du ausschließen kannst das dein Programm die Dateien lockt 😉
Daher dachte ich mir hast du ausprobiert die Dateien während dein Programm läuft zu löschen.

Durch das Debuggen habe ich heraus gefunden, dass vermutlich ein Scanner nicht immer geschlossen wird. Leider habe ich diesen Teil des Programms nicht selber geschrieben.
 

Zurück
Oben