2017-06-11 2 views
1

J'ai un MemoryStream qui extrait les données d'un DataTable. Actuellement, cela alimente une pièce jointe MailMessage et expédie un csv attaché à l'e-mail. Ce que je dois faire est de compresser et de le compresser.C# Compresser et compresser le fichier csv du flux

Donc maintenant je suis itérer à travers chaque ligne d'un DataTable, en ajoutant des virgules appropriées, et en le diffusant. Il en résulte un fichier .bin avec les données. En ajoutant un nom en tant qu'argument de pièce jointe, il envoie au client un fichier csv valide. Est-ce que quelqu'un peut m'aider à compresser et à compresser le fichier csv avant de l'ajouter en pièce jointe? De préférence sans bibliothèques externes. Je vous remercie.

+0

https://docs.microsoft.com/en-us/dotnet/standard/ le fichier csv comprimé (s) io/how-to-compress-and-extract-files – Nkosi

+0

Transmettez le flux directement à un flux de fichier zip, puis passez ce flux à la pièce jointe. – Nkosi

+0

Merci @Nkosi GZipStream semble être la classe pour compresser le flux. Comment puis-je m'assurer que lorsque l'utilisateur final le décompresse, il reçoit un fichier csv ou Excel? – beehive

Répondre

1

Pour une réponse précédente, avec un modèle comme celui-ci,

public FileModel(){ 
    public string FileName {get;set;} 
    public Stream FileStream {get;set;} 
} 

Les méthodes d'extension suivantes ont été définies pour créer une archive zip à diffuser.

public static class ZipArchiveExtensions {  
    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()) { 
      file.FileStream.CopyTo(stream); 
      stream.Position = 0; 
      stream.Close(); 
     } 
     return entry; 
    } 
} 

Avec cela, vous pouvez ajouter une étape avant d'ajouter en pièces jointes

//...other code 

var files = new FileModel[] { 
    new FileModel { 
     FileName = "report1.csv", 
     FileStream = stream 
    }, 
    new FileModel { 
     FileName = "report2.xlsx", 
     FileStream = stream2 
    } 
}; 

var zipStream = files.Compress(); 
mail.Attachments.Add(new Attachment(zipStream, "reports.zip")); 

//...other code