2010-08-08 3 views
0

Java не удаляет файл. Я убедился, что у него есть разрешения (полный контроль для всех, или 777 для вас Unix-ers.) System.out.println (currArchive.delete()) всегда возвращает false. Кто-нибудь знает, почему? Я попробовал обернуть его с помощью исключения безопасности try-catch, но оно не было выбрано. Помогите? Я удостоверился, что все мои потоки были закрыты, но все равно вернулось!Java не удаляет файл

Вот мой код:

метод AddFile из 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(); 
     } 
    } 
} 
+3

Любовь как java настолько лаконична *;) – sje397

+3

Возможно, вы захотите сломать это. –

+3

Опубликовать SSCCE (http://sscce.org) Этот код невозможно прочитать. –

ответ

0

Попробуйте myFile.toPath().delete(), чтобы получить ошибку. И никогда не забудьте закрыть FileInputStream.

+0

Нет такого метода, как toPath. toString и getPath возвращают строки, которые не имеют метода delete(). –

+0

'java.io.File'? – thelost

+0

'toPath()' is java.nio2, это только java 7. –

Смежные вопросы