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

查看:33
本文介绍了用 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 to 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:Friends,则 C:FriendsPerson1Information.txt 的条目应如下所示Person1Information.txt

So, from your example, if the start directory is C:Friends, then the entry for C:FriendsPerson1Information.txt should look like Person1Information.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天全站免登陆