使用Java在Zip文件夹中创建文件夹 [英] Creating Folders in a Zip Folder in Java

查看:345
本文介绍了使用Java在Zip文件夹中创建文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的任务要求我将文件目录保存到zip文件夹中。我唯一的问题是我需要将子文件夹保存为主目录中的文件夹。文件系统看起来像

My task requires me to save a file directory into a zip folder. My only problem is I need to keep the sub-folders as folders from the main Directory. The file system will look something like

C\\Friends
C:\\Friends\\Person1\\Information.txt
C:\\Friends\\Person2\\Information.txt
C:\\Friends\\Person3\\Information.txt



. . .

现在我只能在我的zip文件夹中写入txt文件,但在我的zip文件夹中我需要保留该文件夹结构。我知道我的代码现在的方式会告诉我我正在尝试写的文件是关闭的(无法访问)。到目前为止我的函数:

Right now I am able to write just the txt files inside of my zip folder, but in my zip folder I need to keep that folder structure. I know the way my code is right now will tell me the file I'm trying to write is closed(No access). My Functions thus far:

private String userDirectroy = "" //This is set earlier in the program

public void exportFriends(String pathToFile)
    {
        String source = pathToFile + ".zip";

        try
        {


            String sourceDir = userDirectory;
            String zipFile = source;

            try
            {

                    FileOutputStream fout = new FileOutputStream(zipFile);


                    ZipOutputStream zout = new ZipOutputStream(fout);


                    File fileSource = new File(sourceDir);

                    addDirectory(zout, fileSource);


                    zout.close();

                    System.out.println("Zip file has been created!");
            }       
            catch(Exception e)
            {

            }

        }
        catch(Exception e)
        {
            System.err.println("First Function: " + e);

        }
    }

     private static void addDirectory(ZipOutputStream zout, File fileSource) {


         File[] files = fileSource.listFiles();

         System.out.println("Adding directory " + fileSource.getName());

         for(int i=0; i < files.length; i++)
         {

                 if(files[i].isDirectory())
                 {
                     try
                     {
                         byte[] buffer = new byte[1024];
                         FileInputStream fin = new FileInputStream(files[i]);
                         zout.putNextEntry(new ZipEntry(files[i].getName()));

                         int length;

                         while((length = fin.read(buffer)) > 0)
                         {
                            zout.write(buffer, 0, length);
                         }
                     }
                     catch(Exception e)
                     {
                        System.err.println(e); 
                     }
                         addDirectory(zout, files[i]);
                         continue;
                 }


                 try
                 {
                         System.out.println("Adding file " + files[i].getName());

                         //create byte buffer
                         byte[] buffer = new byte[1024];

                         //create object of FileInputStream
                         FileInputStream fin = new FileInputStream(files[i]);

                         zout.putNextEntry(new ZipEntry(files[i].getName()));


                         int length;

                         while((length = fin.read(buffer)) > 0)
                         {
                            zout.write(buffer, 0, length);
                         }



                          zout.closeEntry();

                          //close the InputStream
                          fin.close();

                 }
                 catch(IOException ioe)
                 {
                         System.out.println("IOException :" + ioe);                             
                 }
         }

 }

任何帮助非常感谢。谢谢

Any help would be much appreciated. Thank You

推荐答案

对于每个文件夹,您需要添加一个空的 ZipEntry 。

For each folder, you need to add a empty ZipEntry of the path.

对于每个文件,您需要提供路径和文件名。这将要求您知道剥离路径的一部分,这将是开始目录之后的所有内容

For each file, you need supply both the path and file name. This will require you to know the part of the path to strip off, this would be everything after the start directory

扩展概念

因此,从您的示例中,如果起始目录是 C:\ Friendnds ,那么<$ c $的条目c> C:\ Friends\Person1 \ Information.txt 应该看起来像 Person1 \Information.txt

So, from your example, if the start directory is C:\Friends, then the entry for C:\Friends\Person1\Information.txt should look like Person1\Information.txt

public void exportFriends(String pathToFile) {

    String source = pathToFile + ".zip";
    try {
        String sourceDir = "C:/Friends";
        String zipFile = source;

        try {
            FileOutputStream fout = new FileOutputStream(zipFile);
            ZipOutputStream zout = new ZipOutputStream(fout);

            File fileSource = new File(sourceDir);

            addDirectory(zout, sourceDir, fileSource);

            zout.close();

            System.out.println("Zip file has been created!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static String getRelativePath(String sourceDir, File file) {
    // Trim off the start of source dir path...
    String path = file.getPath().substring(sourceDir.length());
    if (path.startsWith(File.pathSeparator)) {
        path = path.substring(1);
    }
    return path;
}

private static void addDirectory(ZipOutputStream zout, String sourceDir, File fileSource) throws IOException {
    if (fileSource.isDirectory()) {
        // Add the directory to the zip entry...
        String path = getRelativePath(sourceDir, fileSource);
        if (path.trim().length() > 0) {
            ZipEntry ze = new ZipEntry(getRelativePath(sourceDir, fileSource));
            zout.putNextEntry(ze);
            zout.closeEntry();
        }

        File[] files = fileSource.listFiles();
        System.out.println("Adding directory " + fileSource.getName());
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                addDirectory(zout, sourceDir, files[i]);
            } else {

                System.out.println("Adding file " + files[i].getName());

                //create byte buffer
                byte[] buffer = new byte[1024];

                //create object of FileInputStream
                FileInputStream fin = new FileInputStream(files[i]);
                zout.putNextEntry(new ZipEntry(getRelativePath(sourceDir, files[i])));

                int length;

                while ((length = fin.read(buffer)) > 0) {
                    zout.write(buffer, 0, length);
                }
                zout.closeEntry();
                //close the InputStream
                fin.close();
            }
        }
    }
}

这篇关于使用Java在Zip文件夹中创建文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆