directory 2 zip

Status
Nicht offen für weitere Antworten.

millinär

Bekanntes Mitglied
hat jemand ne methode wo ich einfach:

Code:
createnewzip(outputzip_Name,inputDirector_Name);
eingeben kann und dann werden alle ordner ,files und unterodner...
aus dem "inputDirector_Name" gelesen und in das: "outputzip_Name" geschrieben.
 

millinär

Bekanntes Mitglied
muss ich den müll jetzt wierklich selber schreiben?

kommt schon irgendjemand hat doch bestimmt sowas.
 
G

Guest

Gast
millinär hat gesagt.:
muss ich den müll jetzt wierklich selber schreiben?
Ja, die Welt ist hart. :bae:

Du brauchst zwei Sachen

- Rekursiv die Dateien und Unterverzeichnisse eines gegeben Verzeichnisses zu lesen
- Die gefundenen Dateien in eine Zip-Datei schreiben.

Insgesamt ca. 20 Zeilen Code. Wo ist das Problem?
Hast du Probleme mit der Implementierung, kannst du gezielt nachfragen, was an
deinem Code faul ist.
 

André B.

Bekanntes Mitglied
Das ganze ist garnicht so schwer. Ich habe das letztens mal für eines meiner Programme geschrieben. Hier etwas abgeändert:
Code:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipDir
{
	private static List<File> getDataFiles(File path)
	{
		ArrayList<File> dataFiles = new ArrayList<File>();
		for(File f : path.listFiles())
		{
			if(f.isDirectory())
			{
				//wenn File ein Ordner ist, alle Dateien aus dem Ordner hinzufügen
				dataFiles.addAll(getDataFiles(f));
			}
			else
			{
				//Dateien einfach der Liste hinzufügen
				dataFiles.add(f);
			}
		}
		return dataFiles;
	}

	public static void zipDir(File output, File input)
	{
		ZipOutputStream out = null;
		try
		{
			//ZipOutputStream für das Zipfile erstellen
			out = new ZipOutputStream(new FileOutputStream(output));
		} catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		
		//Kompressionslevel auf die höchste Stufe setzen
		out.setLevel(9);
		System.out.println("Durchsuche Verzeichnis: " + input.getPath());
		
		//Jetzt werden alle Dateien in der for-Schleife durchgegangen
		for(File f : getDataFiles(input) /* Alle Dateien für das Inputverzeichnis herausfinden */)
		{
			try
			{
				System.out.println("Füge dem Archiv hinzu: " + f.getPath().replace(input.getPath(), "").substring(1));
				
				//InputStream für die Datei
				InputStream in = new FileInputStream(f);
				
				//Mit putNextEntry wird ein neuer Abschnitt/eine neue Datei in dem Archiv angelegt
				out.putNextEntry(new ZipEntry(f.getPath().replace(input.getPath(), "").substring(1)));
				
				//Jetzt schreiben wir in den soeben erzeugten Abschnitt
				byte[] buff = new byte[1024];
				int read = 0;
				while((read = in.read(buff)) > 0)
				{
					out.write(buff, 0, read);
				}
				in.close();
			} catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		try
		{
			//ohne das finish() ist das Archiv defekt
			out.finish();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args)
	{
		zipDir(new File("Der Pfad zum Outputfile"), new File("Der Ordner zum hinzufügen"));
	}
}
Das mit dem static ist zwar nicht so toll, aber einfacher ;)
Getestet habe ich den Code mit Eclipse unter Windows.

Wenn du das verwenden willst, ab besten die Konsolenausgaben rausnehmen, ansonsten kannst du das, wenn du es selber machst, vielleicht sogar noch besser lösen. Würde mich mal interessieren, wie man das sonst noch so machen kann.

p.s.: Wenn da Fehler drin sind wäre ich sehr dankbar, wenn ihr mir die mitteilt. Schliesslich verwende ich den Code ja selbst auch ;)

MfG André
 

millinär

Bekanntes Mitglied
THX

werd ich gleich mal ausprobieren sieht nicht so aus als wären fehler drinn

ich hab hinter das
finish(); zeile 73
noch ein
close();
gesetzt.
 

millinär

Bekanntes Mitglied
schlechte nachrichten es ist nicht 100% kompatiebel bei windows funktioniert es aber bei linux erkennt er die neuen ordner nicht.
 

millinär

Bekanntes Mitglied
ich hab die classer erweitert (musste doch alles neu schreiben weil ich nicht wusste woran es lag)
Code:
import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

public class ZipDir 
{ 
    public static void writf(File path,ZipOutputStream zos,String aktuellpos){
        try{
            
File[] allf=path.listFiles();
for(int i=0;i<allf.length;i++){
    
   
     
 if(allf[i].isDirectory()){
     ZipEntry actuall=new ZipEntry(aktuellpos+allf[i].getName()+"/");
          zos.putNextEntry(actuall); 
          writf(allf[i],zos,actuall.getName());
         }
    else{
         zos.putNextEntry(new ZipEntry(aktuellpos+allf[i].getName())); 
        FileInputStream is=null;
            is=new FileInputStream(allf[i]);
            int read=0;
          while((read=is.read())>-1){
            zos.write(read);
                    }
            is.close();
  }
 
}

        }
        catch(Exception e){
           }
    }
   private static List<File> getDataFiles(File path) 
   { 
      ArrayList<File> dataFiles = new ArrayList<File>(); 
      for(File f : path.listFiles()) 
      { 
         if(f.isDirectory()) 
         { 
            //wenn File ein Ordner ist, alle Dateien aus dem Ordner hinzufügen 
            dataFiles.addAll(getDataFiles(f)); 
         } 
         else 
         { 
            //Dateien einfach der Liste hinzufügen 
            dataFiles.add(f); 
         } 
      } 
      return dataFiles; 
   } 

   public static void zipDir(File output, File input) 
   { 
      ZipOutputStream out = null; 
      try 
      { 
         //ZipOutputStream für das Zipfile erstellen 
         out = new ZipOutputStream(new FileOutputStream(output)); 
      } catch (FileNotFoundException e) 
      { 
         e.printStackTrace(); 
      } 
       
      //Kompressionslevel auf die höchste Stufe setzen 
      out.setLevel(3); 
      System.out.println("Durchsuche Verzeichnis: " + input.getPath()); 
       
      //Jetzt werden alle Dateien in der for-Schleife durchgegangen 
      for(File f : getDataFiles(input) /* Alle Dateien für das Inputverzeichnis herausfinden */) 
      { 
         try 
         { 
            System.out.println("Füge dem Archiv hinzu: " + f.getPath().replace(input.getPath(), "").substring(1)); 
             
            //InputStream für die Datei 
            InputStream in = new FileInputStream(f); 
             
            //Mit putNextEntry wird ein neuer Abschnitt/eine neue Datei in dem Archiv angelegt 
            out.putNextEntry(new ZipEntry(f.getPath().replace(input.getPath(), "").substring(1))); 
           
            //Jetzt schreiben wir in den soeben erzeugten Abschnitt 
            byte[] buff = new byte[1024]; 
            int read = 0; 
            while((read = in.read(buff)) > 0) 
            { 
               out.write(buff, 0, read); 
            } 
            in.close(); 
            out.closeEntry();
         } catch (IOException e) 
         { 
            e.printStackTrace(); 
         } 
      } 
      try 
      { 
         //ohne das finish() ist das Archiv defekt 
         out.finish(); 
         out.close();
      } catch (IOException e) 
      { 
         e.printStackTrace(); 
      } 
   } 
public static void zip(File output, File input) {
        try {
            ZipOutputStream zoss=new ZipOutputStream(new FileOutputStream(output));
            writf(input,zoss,"");
          
                zoss.finish();
                zoss.close();
        }
          catch (IOException ex) {
                ex.printStackTrace();
            }

}    

}

die methode zip dürfte unix kompatiebel sein allerdings hab ich den stream nicht gebuffert
naja wer will kanns ja weiter verbessern.
 

André B.

Bekanntes Mitglied
millinär hat gesagt.:
schlechte nachrichten es ist nicht 100% kompatiebel bei windows funktioniert es aber bei linux erkennt er die neuen ordner nicht.
öhm...das is natürlich nicht so toll...jetzt ist die frage: warum erkennt der die neuen ordner nicht? kannst du das nochmal genau erklären? du hast also einen ordner gezippt und mit nem anderen zipprogramm entzippt?
MfG André
 

millinär

Bekanntes Mitglied
ich schätze mal das liegt an den "/" bzw "\" bei windows wird "\" als neuer ordner anerkannt aber bei unix bedeuted das nichts deshalb musste man immer wenn man nen neuen ordner haben will "/" eingeben aber bei dir wurde wahrscheinlich "\" benutzt und deshalb hat es nur bei manchen zip programmen funktioniert

ich bin mir aber nicht ganz sicher ob das stimmt.
 

thE_29

Top Contributor
Und wo wird da bitte mit / oder \ hantiert?

Nirgends...

Habe das ganze auf 1.4 Basis umgebaut (3 Zeilen)

Code:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipDir
{
   private static ArrayList getDataFiles(File path)
   {
      ArrayList dataFiles = new ArrayList();
      File f[] = path.listFiles();
	  for(int x = 0; x != f.length; x++)
      {
         if(f[x].isDirectory())
         {
            //wenn File ein Ordner ist, alle Dateien aus dem Ordner hinzufügen
            dataFiles.addAll(getDataFiles(f[x]));
         }
         else
         {
            //Dateien einfach der Liste hinzufügen
            dataFiles.add(f[x]);
         }
      }
      return dataFiles;
   }

   public static void zipDir(File output, File input)
   {
      ZipOutputStream out = null;
      try
      {
         //ZipOutputStream für das Zipfile erstellen
         out = new ZipOutputStream(new FileOutputStream(output));
      } catch (FileNotFoundException e)
      {
         e.printStackTrace();
      }
      
      //Kompressionslevel auf die höchste Stufe setzen
      out.setLevel(9);
      System.out.println("Durchsuche Verzeichnis: " + input.getPath());
      
      //Jetzt werden alle Dateien in der for-Schleife durchgegangen
      ArrayList tmp = getDataFiles(input);
	  for(int x = 0; x != tmp.size(); x++)
	  //for(File f : getDataFiles(input) /* Alle Dateien für das Inputverzeichnis herausfinden */)
      {
		File f = (File)tmp.get(x);
         try
         {
            System.out.println("Füge dem Archiv hinzu: " + f.getAbsolutePath().substring(input.getAbsolutePath().length() + 1));
            
            //InputStream für die Datei
            InputStream in = new FileInputStream(f);
            
            //Mit putNextEntry wird ein neuer Abschnitt/eine neue Datei in dem Archiv angelegt
            out.putNextEntry(new ZipEntry(f.getAbsolutePath().substring(input.getAbsolutePath().length() + 1)));
            
            //Jetzt schreiben wir in den soeben erzeugten Abschnitt
            byte[] buff = new byte[1024];
            int read = 0;
            while((read = in.read(buff)) > 0)
            {
               out.write(buff, 0, read);
            }
            in.close();
         } catch (IOException e)
         {
            e.printStackTrace();
         }
      }
      try
      {
         //ohne das finish() ist das Archiv defekt
         out.finish();
		 out.close();
      } catch (IOException e)
      {
         e.printStackTrace();
      }
   }
   
   public static void main(String[] args)
   {
      zipDir(new File(args[0]), new File(args[1]));
   }
}

Weiß ja nicht was du geschaft hast, aber bei mir läuft das 1a auch unter Linux..
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben