2016-04-20 8 views
1

Ich habe eine Web-Services, die eine Liste von Dateien zurückgibt. Etwas wie folgt aus:Zip-Datei aus der Liste erstellen <Byte[]> im Speicher

public FileModel(){ 
    string FileName {get;set;} 
    byte[] FileStream {get;set;} 
    string FileType {get;set;} 
} 

Mein Service zurückkehren würde:

List<FileModel> files; 

Ich habe diese Liste Browser zurückzukehren, so brauche ich diese Dateien in einem Zip-Ordner zu komprimieren.

Allerdings kann ich nicht herausfinden, wie dies zu tun, als .NET ZipArchive CreateFromDirectory erfordert, dass ich ein Verzeichnis, in dem die zu komprimierende Datei sind. Aber ich habe kein Verzeichnis, ich habe nur diese Liste. Wie kann ich diese Liste in einen gezippten Ordner umwandeln?

+2

Was meinst du mit * Zip-Methode erstellen *? Alle Konstruktoren der Klasse [ZipArchive] (https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive (v = vs.110) .aspx) akzeptieren 'Stream'. –

+0

'Ich muss diese Liste an den Browser zurückgeben,' Nein, Sie können Dateiname, Dateityp und Dateigröße an den Browser zurückgeben. Wenn der Benutzer tatsächlich eine bestimmte Datei anfordert, können Sie ihn komprimieren .... – Eser

+0

@Eser, Nein, ich muss tatsächlich einen gezippten Ordner der Dateien an den Browser/Benutzer zurückgeben. – Mark

Antwort

2

Bei
public FileModel(){ 
    string FileName {get;set;} 
    byte[] FileStream {get;set;} 
    string FileType {get;set;} 
} 

Die folgenden geschrieben wurde eine Zip-Datei

static class FileModelCompression { 

    public static Stream Compress(this IEnumerable<FileModel> files) { 
     if (files.Any()) { 
      var ms = new MemoryStream(); 
      var archive = new ZipArchive(ms, ZipArchiveMode.Create, false); 
      foreach (var file in files) { 
       var entry = archive.add(file); 
      } 
      ms.Position = 0; 
      return ms; 
     } 
     return null; 
    } 

    private static ZipArchiveEntry add(this ZipArchive archive, FileModel file) { 
     var entry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest); 
     using (var stream = entry.Open()) { 
      stream.Write(file.FIleStream, 0, file.FIleStream.Length); 
      stream.Position = 0; 
      stream.Close(); 
     } 
     return entry; 
    } 
} 
+0

Wenn wir Ihren Code verwenden, können wir diese Datei erstellen und sehen die Dateien in der Zip aber: Wenn wir versuchen, die ZIP zu extrahieren, haben wir einen Fehler über ein unerwartetes Ende des Archivs. – ProblemAnswerQue

+0

@ProblemAnswerQue, Erstellen Sie eine neue Frage, die das/die Problem (e) in einem [mcve] eindeutig dokumentiert und was Sie bis jetzt versucht haben, um es zu lösen. Sehen Sie, ob die Gemeinschaft helfen kann. Es gibt nicht viel, was ich aus dem kurzen Kommentar, den Sie oben haben, zusammentragen kann, da es eine Vielzahl von Gründen für diesen Fehler geben könnte. Sie können diese Frage/Antwort auch als Quelle des von Ihnen versuchten Codes angeben. – Nkosi

Verwandte Themen