2013-05-05 132 views
0

我的任务需要我将文件目录保存到zip文件夹中。我唯一的问题是我需要保留子目录作为主目录中的文件夹。文件系统看起来像在Java中以Zip文件夹创建文件夹

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

。 。 。

现在我可以写我的zip文件夹里面的txt文件,但是在我的zip文件夹中我需要保留那个文件夹结构。我知道我的代码现在的方式会告诉我,我试图写的文件是关闭的(无法访问)。我的功能到目前为止:

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);        
       } 
     } 

} 

任何帮助将不胜感激。谢谢

回答

1

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

对于每个文件,您需要提供路径和文件名。这需要你知道剥掉路径的一部分,这将是启动目录

扩展概念

所以之后的一切,从你的榜样,如果起始目录是C:\Friends,那么对于C:\Friends\Person1\Information.txt条目应该看起来像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(); 
      } 
     } 
    } 
} 
+0

他的代码运行正常,但我无法打开文件? – 2013-11-15 10:20:54