Avatar billede viht Nybegynder
10. januar 2003 - 17:26 Der er 7 kommentarer og
1 løsning

Sletning af filer efter brug

Jeg pakker nogle dll filer ud af en jar fil ved runtime af en applikation og når jeg afslutter applikationen vil jeg gerne slette filerne igen. Problemet er at de ikke bliver slettet, selvom jeg bruger deleteOnExit();

  public void removeAllFiles() {
      File currentFile;
      File currentDir = new File(System.getProperty("user.dir"));
     
      String[] filesToRemove = currentDir.list(new FilenameFilter() {
          public boolean accept(File fil, String filnavn) {
              if( filnavn.endsWith(".dll") )
                  return true;
              return false;
          }
      });
      for ( int i = 0; i < filesToRemove.length; i++ ) {
        currentFile = new File(currentDir+File.separator+filesToRemove[i]);
            currentFile.deleteOnExit();
            System.out.println ("Tried to delete: " +currentFile);
      }
      System.gc();
      System.exit(1);
  }
Avatar billede soreno Praktikant
10. januar 2003 - 17:35 #1
Requests that the file or directory denoted by this abstract pathname be deleted when the virtual machine terminates. Deletion will be attempted only for normal termination of the virtual machine, as defined by the Java Language Specification.

Derfor prøv:
System.exit(0);

Da der om exit står:
Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.
Avatar billede soreno Praktikant
10. januar 2003 - 17:36 #2
Det øverste var fra deleteOnExit()..
Avatar billede viht Nybegynder
10. januar 2003 - 18:03 #3
Det gør ingen forskel. Jeg kan lige nævne at metoden godt virker på filer jeg ikke bruger i mit program, altså f.eks. tekstfiler. Jeg tror det er fordi der ikke rigtig bliver givet slip på de dll filer fra Java siden. Jeg loader dem ind når programmet køres med System.loadLibrary(...), så kunne det tænkes de ved program exit stadig er in use?
Avatar billede Slettet bruger
11. januar 2003 - 02:37 #4
Er der ingen af filerne der bliver slettet?

Måske den sidste i løkken?

Prøv at lade være med at garbage collecte.
Avatar billede viht Nybegynder
11. januar 2003 - 11:16 #5
Ingen af filerne bliver slettet og det hjælper ikke at fjerne garbagecollection :( De må stadig være i brug.
Avatar billede arne_v Ekspert
11. januar 2003 - 12:56 #6
1)  Jeg er overbeist om at problemet ganske rigtigt er, at DLL-filerne
    er i brug indtil java.exe/javaw.exe har afsluttet og derfor ikke
    kan slettes.

2)  Jeg tror, at den bedste løsning er at omdesigne din unjar+brug+slet
    løsning.

    Hvad med f.eks.:
      test of DLL filer er extracted
      hvis ikke så extract
      lad dem blive udenfor
    ?

3)  Hvis du absolut vil bruge konceptet, så:
      lad dit program starte et ny program i en ny JVM
      det nye program venter lidt
      dit program afslutter og JVM forsvinder
      det nye program sletter filer
Avatar billede Slettet bruger
11. januar 2003 - 13:18 #7
Her er et uddrag fra java's buge reports.

http://developer.java.sun.com/developer/bugParade/bugs/4171239.html

Bug Id  4171239

Votes  32

Synopsis  java.io.File.deleteOnExit does not work on open files (win32)

Category  java:classes_io

Reported Against  1.2fcs, 1.2.2, kestrel-rc2, 1.3, 1.3.1

Release Fixed 

State  In progress, bug

Related Bugs 

Submit Date  Sep 03, 1998

Description  If the File.deleteOnExit method is invoked on a File object, and one or more
instances of FileInputStream, FileOutputStream, or RandomAccessFile are open on
the file at the time the VM exits, then the file will not be deleted.  This
occurs only on win32, which does not allow a file to be deleted until all
streams on it have been closed.  -- xxxxx@xxxxx 9/3/1998





java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0-C)
Java HotSpot(TM) Client VM (build 1.3.0-C, mixed mode)


In the code below, the line that is commented-out causes the temporary file to
not be deleted on JVM exit. If the line is uncommented, the file does get
deleted.

Possibly the garbage collection for a RandomAccessFile should close the file
just in case it was not closed. If Java had destructors, the destructor for
this class would make sure to close the RandomAccessFile.


----------
import java.io.*;

public class DeleteTest {

    private static String FILE_PREFIX = "inet";
    private File tempFile;
    private RandomAccessFile raf;

    public DeleteTest() {
        try {

            tempFile = File.createTempFile(FILE_PREFIX, null);
            System.out.println("TEMPFILE = " +
tempFile.getAbsolutePath());
            raf = new RandomAccessFile(tempFile, "rw");

            tempFile.deleteOnExit();

            DbByteArrayOutputStream bout = new
DbByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bout);

            String testStr = new String("TEST STRING");
            out.writeObject(testStr);
            out.flush();

            bout.writeTo(raf);
            bout.close();

            //raf.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String args[]) {
        DeleteTest app = new DeleteTest();
    }


    public class DbByteArrayOutputStream extends ByteArrayOutputStream {

        public DbByteArrayOutputStream() {
            super();
        }

        public DbByteArrayOutputStream(int size) {
            super(size);
        }

        public synchronized void writeTo(DataOutput dstr) throws
IOException {
            byte[] data = super.buf;
            int len = super.size();
            dstr.write(data, 0, len);
        }

    }
}
(Review ID: 105968)


webbug tony_lapaso jay95

Workaround 



Make sure you close any file for which the deleteOnExit() method
was/is called.


(Review ID: 103452)





Must open and close the RandomAccessFile each time we need to access it. Cannot
just open it in a constructor and leave it open.
(Review ID: 105968)



Evaluation  Too risky to fix for 1.2fcs.  Suggested fix probably requires a JVM change.
Lowering priority to 4 since we've found an alternative fix for the immediate
problem of temporary zip files not being deleted.  -- xxxxx@xxxxx 9/9/1998

Så du bliver nødt til explicit at lukke hver fildescriptor. Hvilket du ikke kan når du bruger loadlibrary.

Jeg vil tro arne v's måde at løse problemet på er den bedste løsning.
Avatar billede viht Nybegynder
11. januar 2003 - 23:54 #8
Tak for jeres ideer, jeg arbejder videre med arne_v's alternativ.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester