Nach Dateinamen in Zipdatei suchen ohne zu zippen

Perserhood

Grünschnabel
Hallo,
ich hab folgendes Porblem.
Ich hab mehrere zipdateien die auch ziemlich gross sind. Jetzt suche ich nach einer Datei die in einer zipdatei ist. ich weiss nur nicht in welcher. Gibt es eine möglichkeit nach den Dateinamen in der Zipdatei zu suchen
und feststellen ob die Datei da überhaupt drin ist. da ich fürs entpacken aller zipdateien ewig brauchen würde.
habt ihr eine ahnung wie ich das am besten implementieren könnte. Ich bin für jede Hilfe dankbar;)
 
Hi.

Je nachdem wieviele Dateien es sind solltest doch auch manuell nachsehen können? Mit einem entsprechenden Packprogramm öffnen, und nachsehen was drinnen ist. Dabei wird ja noch nichts entpackt.

Wenn es weniger Aufwand ist, schnell mal ein Programm zu erstellen, kannst dir aber die #ziplib ansehen. :)

Hier ein Codebeispiel von denen. Es listet einfach die Dateien in einem Zipfile auf, und gibt diese gegebenenfalls auch aus.. diesen Teil brauchst aber ja nicht zu verwenden.

lg,..

C#:
// project created on 10.11.2001 at 13:09
using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;

using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;


class MainClass
{			
	public static void Main(string[] args)
	{
		// Perform simple parameter checking.
		if ( args.Length < 1 ) {
			Console.WriteLine("Usage ViewZipFile NameOfFile");
			return;
		}
		
		if ( !File.Exists(args[0]) ) {
			Console.WriteLine("Cannot find file '{0}'", args[0]);
			return;
		}

		// For IO there should be exception handling but in this case its been ommitted
		
		byte[] data = new byte[4096];
		
		using (ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]))) {
		
			ZipEntry theEntry;
			while ((theEntry = s.GetNextEntry()) != null) {
				Console.WriteLine("Name : {0}", theEntry.Name);
				Console.WriteLine("Date : {0}", theEntry.DateTime);
				Console.WriteLine("Size : (-1, if the size information is in the footer)");
				Console.WriteLine("      Uncompressed : {0}", theEntry.Size);
				Console.WriteLine("      Compressed   : {0}", theEntry.CompressedSize);
				
				if ( theEntry.IsFile ) {
					
					// Assuming the contents are text may be ok depending on what you are doing
					// here its fine as its shows how data can be read from a Zip archive.
					Console.Write("Show entry text (y/n) ?");
					
					if (Console.ReadLine() == "y") {
						int size = s.Read(data, 0, data.Length);
						while (size > 0) {
							Console.Write(Encoding.ASCII.GetString(data, 0, size));
							size = s.Read(data, 0, data.Length);
						}
					}
					Console.WriteLine();
				}
			}
			
			// Close can be ommitted as the using statement will do it automatically
			// but leaving it here reminds you that is should be done.
			s.Close();
		}
	}
}
 
Danke sowas ähnliches hab ich schon gefunden. mir gehts eher darum den namen einzugeben und ich krieg zurück ob er drin ist oder nicht. Also eher dass er selber vergleicht.. ich hab 100te von zip dateien manuel ist bisschen anstrengend auf dauer.
Das Problem beim Vergleich ist auch das in der zipdatei der name mit pfad steht. also muss ich glaub ich beim suchen auch den pfad eingeben oder mit hilfe von contain es machen. ist net so leicht:)
 
Du kannst ja den Code oben trotzdem übernehmen. theEntry.name hat ja den Namen des Items.

Über string.LastIndexOf kommst du an den letzten \-separator im Pfad und kannst dann vergleichen.
 
Sollte dann doch kein Problem sein? Du kennst den Dateinamen, du weisst wie du die ganzen Einträge in einer ZipDatei durchlaufen kannst, mehr brauchst doch nicht?

Hier mal der entsprechende Teil abgeändert:

C#:
        string filename = "test.txt";
	
	using (ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]))) {
        
            ZipEntry theEntry;
            while ((theEntry = s.GetNextEntry()) != null) {

                if ( theEntry.IsFile && System.IO.Path.GetFilenNme(theEntry.Name) == filename ) {
                    Console.WriteLine("Found!");
		    break;
                }
            }
            
            // Close can be ommitted as the using statement will do it automatically
            // but leaving it here reminds you that is should be done.
            s.Close();
        }
 
Vielen Dank, hab jedoch noch ein kleines Problem.
Im Unternehmen nutzen wir nur ionic.zip.
hab dazu nix gefunden weiss also nicht ob es mit dieser bib auch klappen würde
 
Ja, das müsste auch klappen, da ändern sich halt einfach die Namen der Funktionen, das grobe Vorgehen und die Namespaces, aber das Prinzip dürfte gleich sein.
 
Ja hast recht, das müsste klappen. Ich suche grade wie die Funktionen bei ionic heissen müssen. Ist nicht so leicht da was zu finden:(
ich find einfach nichts dazu, ist echt zum verzweifeln
 
Zuletzt bearbeitet:
Zurück