2013-06-07 9 views
5

Sono di fronte a un problema insolito. Sto costruendo uno strumento che è programmato per funzionare ogni 5 minuti. Raccoglierà i file zip da una particolare directory ed estrae i file (a seconda del nome del file) in una destinazione. Sto usando zipentry per ottenere ogni nome di file nel file zip e quindi estratto come richiesto, quindi li appoggio (file zip, una volta che ho finito tutti i file in un file zip) in una directory specifica e quindi eliminare il file zip. Ma a volte (non sempre) i file zip non vengono cancellati. Dal momento che sto usando fileutils.forcedelete(). Ricevo un'eccezione: impossibile eliminare il file. Così ho cambiato il codice per utilizzare fileutils.forcedeleteonexit() ancora alcuni file rimangono nella fonte.Impossibile cancellare il file zip dopo la decompressione?

Ecco un esempio del mio codice:

sourceFile=new file(zipfile); 
zipFile = new ZipFile(sourceFile); 
zEnum = (Enumeration<ZipEntry>) zipFile.entries(); 
for (int a = 0; a < zipFile.size(); a++) 
{ 
    ZipEntry zE = zEnum.nextElement(); 
    //Function uses zip4j for extracting. No streams used. 
    extract(String sourceZipFile, String fileNameToExtract, String outputFolder); 
} 
//I tried it with finally either 
zipFile.close(); 

//Using fileutils to copy. No streams used. 
copyFile(sourceFile, backup); 

FileUtils.forceDeleteOnExit(sourceFile); 

Non ci sono corsi d'acqua utilizzati, ma sto ottenendo un blocco su file a volte (non sempre). Quello che sembra essere il bug qui? E 'l'estrazione zip4j che sta causando il problema o altro? Sto usando zip4j 1.3.1.

+3

Quale sistema operativo? Windows ha notori problemi con handle di file e cancellazioni ... – fge

+0

@fge: Windows.tried nel mio locale e su un server (Windows Server 2008 R2) –

+0

@fge Non posso dire quante volte Windows mi ha detto "file in utilizzare "quando si tenta di eliminare un archivio dopo aver estratto i suoi dati, ma è certamente stato più volte di quanto possa contare su entrambe le mani. È colpa dei programmi che non chiudono correttamente i loro handle di file o Windows mantiene alcuni file aperti anche dopo che i programmi li chiudono? – JAB

risposta

0

Utilizzare IO di apache-commons FileDeleteStrategy. Qualcosa di simile:

FileDeleteStrategy.FORCE.delete(file); 

Aggiornamento:

Dovrebbe essere il modo in cui IO viene gestita nell'applicazione. Ho scritto un semplice codice che copia un file zip in un file zip temporaneo, sgonfia lo zip temporaneo e dopo pochi secondi lo elimina. Ecco qui:

public class ZipTest { 

private static String dirPath = "/home/ubuntuuser/Desktop/"; 

public static void main(String[] args) throws Exception { 

    File myzip = new File(dirPath + "content.zip"); 
    String tempFileStr = dirPath + "content_temp.zip"; 
    File tempFile = new File(tempFileStr); 
    String unzipFolderStr = dirPath + "unzip"; 


    copyUsingChannels(myzip, tempFile); 

    // copyUsingStreams(myzip, tempFile); 

    unZip(tempFileStr, unzipFolderStr); 

    Thread.sleep(3000); 

    tempFile.delete(); 


} 

private static void copyUsingStreams(File myzip, File tempFile) 
     throws IOException, FileNotFoundException { 
    byte[] barray = new byte[1024]; 

    if (!tempFile.exists()) 
    { 
     tempFile.createNewFile(); 
    } 

    FileOutputStream fos = new FileOutputStream(tempFile); 
    FileInputStream fis = new FileInputStream(myzip); 

    int length = 0; 

    while ((length = fis.read(barray)) != -1) 
    { 
     fos.write(barray, 0, length); 
    } 

    fis.close(); 
    fos.close(); 
} 

public static void copyUsingChannels(final File srcFile, final File destFile) throws Exception 
{ 
    if (!destFile.exists()) 
    { 
     destFile.createNewFile(); 
    } 

    FileChannel source = new FileInputStream(srcFile).getChannel(); 
    FileChannel destination = new FileOutputStream(destFile).getChannel(); 

    source.transferTo(0, source.size(), destination); 

    source.close(); 
    destination.close(); 
} 

private static void unZip(String zipFile, String outputFolder) throws Exception { 

    byte[] buffer = new byte[1024]; 

    File folder = new File(outputFolder); 
    if (!folder.exists()) { 
     folder.mkdir(); 
    } 

    ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile)); 
    ZipEntry ze = zis.getNextEntry(); 

    while (ze != null) { 

     String fileName = ze.getName(); 

     File newFile = new File(outputFolder + File.separator + fileName); 

     System.out.println("file unzip : " + newFile.getAbsoluteFile()); 

     new File(newFile.getParent()).mkdirs(); 

     if (ze.isDirectory()) 
     { 
      newFile.mkdir(); 
      ze = zis.getNextEntry(); 
      continue; 
     } 

     FileOutputStream fos = new FileOutputStream(newFile); 

     int len; 
     while ((len = zis.read(buffer)) > 0) { 
      fos.write(buffer, 0, len); 
     } 

     fos.close(); 
     ze = zis.getNextEntry(); 
    } 

    zis.closeEntry(); 
    zis.close(); 
} 

} 
+0

stesso problema: impossibile eliminare il file! –

+0

Puoi confermare se questo non è dovuto al fatto che il comando 'copia' sopra l'eliminazione è ancora in corso? – Chris

+0

@ Chris.how posso controllare that.if posso quindi posso codice da cancellare una volta che la copia è fatta. –

0

Penso che il tuo problema si sia verificato con i buffer dei file OS, che a volte non vengono scaricati quando stai cercando di eliminare il file. Hai provato a utilizzare sourceFile.deleteOnExit() invece FileUtils.forceDeleteOnExit (sourceFile)? Inoltre è possibile provare a controllare sourceFile.canWrite prima della cancellazione (può essere che può aiuta) Si può anche provare ad usare FileInputStream() prima di cancellare:

FileInputStream fi = new FileInputStream(sourceFile); 
fi.getFD().sync(); 
+0

ho provato con deleteOnExit() anche lo stesso problema exit.i non ha usato alcun FileInputStream perché pensavo che potesse essere il cuprit –

+0

sourFile.canwrite restituisce sempre vero !! –