папка почтового индекса java затем удаляет оригинальную папку - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть класс, который сжимает папку "UNO", которая содержит три файла ".txt", в zip-файл с именем "UNO.zip", и у меня есть другой класс, который рекурсивно удаляет исходную папку "UNO" ивсе его содержимое.Когда я выполняю их отдельно, они работают как шарм.Но когда я пытаюсь выполнить их в одном и том же потоке, сжатие идет хорошо, но удаляющая часть просто удаляет последний «.txt» файл внутри папки ... и мне нужно запустить класс еще два раза, чтобы он удалилФайлы .txt и, наконец, оригинальная папка.

Может кто-нибудь сказать мне, почему это происходит?Благодарю.

Это код:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Z3 {

    public static void main(String[] args) {

        byte[] buffer = new byte[1024];
        String ruta = "C:\\DESCARGAS\\";
        String nombreDeLaCarpeta = "UNO";
        List<String> nombresDeLosArchivos = new ArrayList<String>();

          File carpeta = new File( ruta + nombreDeLaCarpeta );
          File[] listadoEnCarpeta = carpeta.listFiles();
                if ( listadoEnCarpeta != null ) {
                    for ( int i = 0; i < listadoEnCarpeta.length; i ++ ) {

                        nombresDeLosArchivos.add( listadoEnCarpeta[i].getPath().substring( ruta.length() + nombreDeLaCarpeta.length() + 1, 
                                listadoEnCarpeta[i].getPath().length() ) );

                    }
               }

        FileOutputStream fos = null;
        ZipEntry ze = null;
        FileInputStream in = null;
        ZipOutputStream zos = null;

        try {
            fos = new FileOutputStream( "C:\\DESCARGAS\\UNO.zip" );
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        zos = new ZipOutputStream( fos );

        for ( int i = 0; i < nombresDeLosArchivos.size(); i ++ ) {
            ze = new ZipEntry( nombresDeLosArchivos.get(i) );
            try {
                zos.putNextEntry( ze );
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in = new FileInputStream( ruta + nombreDeLaCarpeta + "\\" + nombresDeLosArchivos.get(i) );
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            int len;
            try {
                while ( ( len = in.read( buffer ) ) > 0 ) {
                    zos.write( buffer, 0, len );
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            }

            try {
                in.close();
                zos.closeEntry();
                zos.flush();
                zos.close();
                fos.flush();
                fos.close();

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

            // ------------------------------------------------------------

            File directory = new File( ruta + nombreDeLaCarpeta );
            if ( directory.exists() ) {
                    try {
                        eliminarSubcarpetas( directory );
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }


    }

    public static void eliminarSubcarpetas( File file ) throws IOException {

        File[] files = file.listFiles();
        if ( files != null ) {
            for ( File f: files ) {
                if ( f.isDirectory() ) {
                    eliminarSubcarpetas( f );
                } else {
                    f.delete();
                    System.out.println( f.getAbsolutePath() );
                }
            }
        }


      file.delete();

    }

}

1 Ответ

0 голосов
/ 03 октября 2018

Это был простой вопрос, что выходные потоки не были закрыты должным образом.Я просто должен был поставить блок сжатия другим способом, и это помогло.

Вот код:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Z2 {

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

        List<String> nombresDeLosArchivos = new ArrayList<String>();

        File carpeta = new File( "C:\\DESCARGAS\\UNO" );
        File[] listadoEnCarpeta = carpeta.listFiles();

                if ( listadoEnCarpeta != null ) {
                    for ( int i = 0; i < listadoEnCarpeta.length; i ++ ) {

                        nombresDeLosArchivos.add( listadoEnCarpeta[i].getPath() );

                    }
               }

            zipArchivo( "C:\\DESCARGAS\\UNO.zip", nombresDeLosArchivos);

            File directory = new File( "C:\\DESCARGAS\\UNO" );
            if ( directory.exists() ) {

                    try {
                        eliminarSubcarpetas( directory );
                    } catch (IOException e) {
                        e.printStackTrace();
                    }   
            }


    }

    public static void zipArchivo( String zipFile, List<String> listaDeStrings ) throws IOException {

        byte[] buffer = new byte[1024];
        FileOutputStream fos = new FileOutputStream( zipFile );
        ZipOutputStream zos = new ZipOutputStream( fos );

        for ( int i = 0; i < listaDeStrings.size(); i ++ ) {

            File scrFile = new File( listaDeStrings.get(i) ); 
            FileInputStream fis = new FileInputStream ( scrFile );
            zos.putNextEntry( new ZipEntry ( scrFile.getName() ) );

            int length;

            while ( ( length = fis.read( buffer) ) > 0 ) {
                zos.write( buffer, 0, length );
            }

            zos.closeEntry();

            fis.close();

        }

        zos.close();


    }

    public static void eliminarSubcarpetas( File file ) throws IOException {

        File[] files = file.listFiles();
        if ( files != null ) {

            for ( File f: files ) {
                  if ( f.isDirectory() ) {
                    eliminarSubcarpetas( f );
                } else {
                    f.delete();
                }
            }
        }

        file.delete();

    }

}
...