views:

86

answers:

1

Java isn't deleting a file. I made sure it has permissions (full control to everyone, or 777 for you Unix-ers.) The System.out.println(currArchive.delete()) always returns false. Does anyone know why? I tried wrapping it with a try-catch security exception but it wasn't thrown. help? I made sure all my streams were closed, but it still returned false!

Here is my code:

addFile method of TarGzipManagerView.java

private void addInside(java.awt.event.ActionEvent evt) {
if (isCurrArchived == EXTRACTING){
        final ActionEvent acevt = evt;
        JFileChooser jfc = new JFileChooser();
        jfc.setDialogType(JFileChooser.OPEN_DIALOG);
        jfc.setMultiSelectionEnabled(true);
        jfc.setAcceptAllFileFilterUsed(true);
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        jfc.setDialogTitle("Choose files to add:");
        int result = jfc.showOpenDialog(theframe);
        if (result == JFileChooser.APPROVE_OPTION){
            File[] addsf = jfc.getSelectedFiles();
            totalNewFilesToAdd = new ArrayList<File>();
            ArrayList<File> newFilesToAdd = new ArrayList<File>();
            ArrayList<AbsRelFile> dirEntries = new ArrayList<AbsRelFile>();
            InputStream in = null;
            try {
                in = new BufferedInputStream(new FileInputStream(currArchive));
            } catch (FileNotFoundException fnfe){
                return;
            }
            currAStream = null;
            currCStream = null;
            CompressorStreamFactory cFactory = new CompressorStreamFactory();
            try {
                CompressorInputStream temp = cFactory.createCompressorInputStream(in);
                currCStream = temp.getName();
                in = new BufferedInputStream(temp);
            } catch (CompressorException ex) {
                //if it isn't compressed, do nothing!
            }
            ArchiveStreamFactory aFactory = new ArchiveStreamFactory();
            realIn = null;
            useZipFile = false;
            try {
                realIn = aFactory.createArchiveInputStream(in);
                currAStream = realIn.getArchiveName();
                if (currAStream.equalsIgnoreCase(ArchiveStreamFactory.ZIP)){
                    useZipFile = true;
                    try {
                        realIn.close();
                    } catch (IOException ioe){
                        ioe.printStackTrace();
                    }
                }
            } catch (ArchiveException ae){
                //Bad Archive! oops!
                new ErrorDialog(theframe, false).setVisible(true);
                try {
                    in.close();
                } catch (IOException ioe){
                    ioe.printStackTrace();
                }
                return;
            }
            bytesToWrite = 0;
            if (!useZipFile){
                ArchiveEntry ae;
                try {
                    while ((ae = realIn.getNextEntry()) != null){
                        bytesToWrite += ae.getSize();
                    }
                } catch (IOException ioe){
                    ioe.printStackTrace();
                }
                try {
                    realIn.close();
                } catch (IOException ioe){
                    ioe.printStackTrace();
                }
            } else {
                ZipArchiveEntry ae;
                try {
                    ZipFile zf = new ZipFile(currArchive);
                    Enumeration en = zf.getEntriesEnum();
                    while (en.hasMoreElements()){
                        ae = (ZipArchiveEntry) en.nextElement();
                        bytesToWrite += ae.getSize();
                    }
                    zf.close();
                } catch (IOException ioe){
                    ioe.printStackTrace();
                }
            }
            try {
                in = new BufferedInputStream(new FileInputStream(currArchive));
            } catch (FileNotFoundException fnfe){
                return;
            }
            currAStream = null;
            currCStream = null;
            cFactory = new CompressorStreamFactory();
            try {
                CompressorInputStream temp = cFactory.createCompressorInputStream(in);
                currCStream = temp.getName();
                in = new BufferedInputStream(temp);
            } catch (CompressorException ex) {
                //if it isn't compressed, do nothing!
            }
            aFactory = new ArchiveStreamFactory();
            realIn = null;
            useZipFile = false;
            try {
                realIn = aFactory.createArchiveInputStream(in);
                currAStream = realIn.getArchiveName();
                if (currAStream.equalsIgnoreCase(ArchiveStreamFactory.ZIP)){
                    useZipFile = true;
                    try {
                        realIn.close();
                    } catch (IOException ioe){
                        ioe.printStackTrace();
                    }
                }
            } catch (ArchiveException ae){
                //Bad Archive! oops!
                new ErrorDialog(theframe, false).setVisible(true);
                try {
                    in.close();
                } catch (IOException ioe){
                    ioe.printStackTrace();
                }
                return;
            }
            for (int i = 0;i<addsf.length;i++){
                if (addsf[i].isFile()){
                    newFilesToAdd.add(addsf[i]);
                    totalNewFilesToAdd.add(addsf[i]);
                }
                if (addsf[i].isDirectory()){
                    dirEntries.addAll(recurseDir(addsf[i]));
                    totalNewFilesToAdd.addAll(recurseDir(addsf[i]));
                }
            }
            for (int i = 0;i<totalNewFilesToAdd.size();i++){
                bytesToWrite += totalNewFilesToAdd.get(i).length();
            }
            aentries = new ArchiveEntry[totalNewFilesToAdd.size()];
            for (int i = 0;i<newFilesToAdd.size();i++){
                try {
                    aentries[i] = new ArchiveStreamFactory().createArchiveEntry(currAStream, newFilesToAdd.get(i), newFilesToAdd.get(i).getName());
                } catch (ArchiveException ae){
                    ae.printStackTrace();
                }
            }
            for (int i = newFilesToAdd.size();i<totalNewFilesToAdd.size();i++){
                try {
                    aentries[i] = new ArchiveStreamFactory().createArchiveEntry(currAStream, dirEntries.get(i-newFilesToAdd.size()), dirEntries.get(i-newFilesToAdd.size()).getRelativePath());
                } catch (ArchiveException ae){
                    ae.printStackTrace();
                }
            }
            Thread iothread = new Thread(new Runnable(){
                public void run(){
                    if (!useZipFile){
                        try {
                            EventQueue.invokeLater(new Runnable(){
                                public void run(){
                                    addingBox = new AddingBox(theframe, false);
                                }
                            });
                            File outfile = File.createTempFile("ScruffArchiveManager", null);
                            ArchiveOutputStream tempout = null;
                            CompressorOutputStream tempcomp = null;
                            if (currCStream == null) tempout = new ArchiveStreamFactory().createArchiveOutputStream(currAStream ,new BufferedOutputStream(new FileOutputStream(outfile)));
                            else {
                                tempcomp = new CompressorStreamFactory().createCompressorOutputStream(currCStream, new BufferedOutputStream(new FileOutputStream(outfile)));
                                tempout = new ArchiveStreamFactory().createArchiveOutputStream(currAStream, tempcomp);
                            }
                            if (currAStream.equals(ArchiveStreamFactory.TAR)){
                                TarArchiveOutputStream t = (TarArchiveOutputStream)tempout;
                                t.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
                                tempout = t;
                            }
                            ArchiveEntry ae;
                            long bytesWritten = 0;
                            while ((ae = realIn.getNextEntry()) != null){
                                long semiBytesWritten = 0;
                                tempout.putArchiveEntry(ae);
                                byte[] buffer = new byte[8024];
                                int n = 0;
                                if (ae.getSize() < semiBytesWritten + 8024) buffer = new byte[(int)(ae.getSize()-semiBytesWritten)];
                                while (semiBytesWritten < ae.getSize() && -1 != (n = realIn.read(buffer))){
                                    tempout.write(buffer, 0, n);
                                    semiBytesWritten += n;
                                    bytesWritten += n;
                                    final long k = bytesWritten;
                                    EventQueue.invokeLater(new Runnable(){
                                        public void run(){
                                            addingBox.progressListener(new Progress(k, bytesToWrite));
                                        }
                                    });
                                    if (ae.getSize() < semiBytesWritten + 8024) buffer = new byte[(int)(ae.getSize()-semiBytesWritten)];
                                }
                                tempout.closeArchiveEntry();
                            }
                            realIn.close();
                            for (int i = 0;i<aentries.length;i++){
                                InputStream in = new BufferedInputStream(new FileInputStream(aentries[i].getFile()));
                                tempout.putArchiveEntry(aentries[i]);
                                int n = 0;
                                byte[] buffer = new byte[8024];
                                while (-1 != (n = in.read(buffer))){
                                    tempout.write(buffer, 0, n);
                                    bytesWritten += n;
                                    final long k = bytesWritten;
                                    EventQueue.invokeLater(new Runnable(){
                                        public void run(){
                                            addingBox.progressListener(new Progress(k, bytesToWrite));
                                        }
                                    });
                                }
                                in.close();
                                tempout.closeArchiveEntry();
                            }
                            tempout.close();
                            final File ne = new File(currArchive.getAbsolutePath());
                            System.out.println(currArchive.delete());
                            outfile.renameTo(ne);
                            EventQueue.invokeLater(new Runnable(){
                                public void run(){
                                    closeArchive(acevt);
                                    openArchive(ne);
                                    addingBox.progressListener(new Progress(bytesToWrite, bytesToWrite));
                                }
                            });
                        } catch (CompressorException ce){
                            ce.printStackTrace();
                        } catch (ArchiveException ae){
                            ae.printStackTrace();
                        } catch (IOException ioe){
                            ioe.printStackTrace();
                        }
                    }
                }
            });
            iothread.start();
        }
    }
}
A: 

Try myFile.toPath().delete() to get the error. And never forget to close the FileInputStream.

thelost
There is no such method as toPath. toString and getPath both return strings, which don't have a delete() method.
Leo Izen
`java.io.File` ?
thelost
`toPath()` is java.nio2, it's java 7 only.
tulskiy