2009-03-25 12 views
23

SCORMパッケージを作成するために、いくつかのファイルを.zipに動的にパッケージ化する必要があります。誰でもコードを使用してこれを行う方法を知っていますか? .zipの内部にフォルダ構造を動的に構築することは可能ですか?ASP.NETを使用してZIPファイルを作成して埋め込む方法は?

+0

[System.IO.Packagingを使用してZIPファイルを生成する](http://stackoverflow.com/questions/6386113/using-system-io-packaging-to-generate-a-zip-file)の可能な複製 – Will

答えて

14

もう外部ライブラリを使用する必要はありません。 System.IO.Packagingには、コンテンツをZI​​Pファイルにドロップするために使用できるクラスがあります。しかし、それは単純ではありません。 Here's a blog post with an example(終わりに、それのために掘る)。


リンクが安定していないため、ここではJonが投稿で提供している例を示します。

using System; 
using System.IO; 
using System.IO.Packaging; 

namespace ZipSample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AddFileToZip("Output.zip", @"C:\Windows\Notepad.exe"); 
      AddFileToZip("Output.zip", @"C:\Windows\System32\Calc.exe"); 
     } 

     private const long BUFFER_SIZE = 4096; 

     private static void AddFileToZip(string zipFilename, string fileToAdd) 
     { 
      using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) 
      { 
       string destFilename = ".\\" + Path.GetFileName(fileToAdd); 
       Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative)); 
       if (zip.PartExists(uri)) 
       { 
        zip.DeletePart(uri); 
       } 
       PackagePart part = zip.CreatePart(uri, "",CompressionOption.Normal); 
       using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read)) 
       { 
        using (Stream dest = part.GetStream()) 
        { 
         CopyStream(fileStream, dest); 
        } 
       } 
      } 
     } 

     private static void CopyStream(System.IO.FileStream inputStream, System.IO.Stream outputStream) 
     { 
      long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE; 
      byte[] buffer = new byte[bufferSize]; 
      int bytesRead = 0; 
      long bytesWritten = 0; 
      while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       outputStream.Write(buffer, 0, bytesRead); 
       bytesWritten += bytesRead; 
      } 
     } 
    } 
} 
+0

+1 –

+0

このリンクをもう一度見てくださいhttp://weblogs.asp.net/dneimke/archive/2005/02/25/380273.aspx – daitangio

+0

リンクが壊れています – bpoiss

1

私はこのためにチルカットからの無料成分を使用しました:http://www.chilkatsoft.com/zip-dotnet.asp。しかし、私が必要としているものはほとんどありますが、ファイル構造を動的に構築することについてはわかりません。

+0

私達は私達の会社でこの部品を使用した。コンポーネントのエラーに基づいて、極端なストレスを受けたサービスの一部がEngineExceptionを引き起こしました。 Microsoft Support Ticketの後、SharpZLibに切り替えることにしました。これは2年前です。私はコンポーネントが今日どれくらい良いのか分かりません。 –

+0

私たちはこれまで何の問題も抱えていませんでしたが、一般に毎時、通常は毎日実行される輸出サービスで使用されています。この暗号化は、著者が最新の状態に保っている非常に便利なリンクとしても役に立ちます。 – Macros

20

DotNetZipです。 Working example

ジップをResponse.OutputStreamに直接書き込むことができます。コードは次のようになります。

Response.Clear(); 
    Response.BufferOutput = false; // for large files... 
    System.Web.HttpContext c= System.Web.HttpContext.Current; 
    String ReadmeText= "Hello!\n\nThis is a README..." + DateTime.Now.ToString("G"); 
    string archiveName= String.Format("archive-{0}.zip", 
             DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip"; 
    Response.AddHeader("content-disposition", "filename=" + archiveName); 

    using (ZipFile zip = new ZipFile()) 
    { 
     // filesToInclude is an IEnumerable<String>, like String[] or List<String> 
     zip.AddFiles(filesToInclude, "files");    

     // Add a file from a string 
     zip.AddEntry("Readme.txt", "", ReadmeText); 
     zip.Save(Response.OutputStream); 
    } 
    // Response.End(); // no! See http://stackoverflow.com/questions/1087777 
    Response.Close(); 

DotNetZipは無料です。

0

「オンザフライ」でZIPファイルを作成するには、Rebex ZIPコンポーネントを使用します。

次のサンプルは、サブフォルダを作成するなど、完全にそれを説明します

// prepare MemoryStream to create ZIP archive within 
using (MemoryStream ms = new MemoryStream()) 
{ 
    // create new ZIP archive within prepared MemoryStream 
    using (ZipArchive zip = new ZipArchive(ms)) 
    {    
     // add some files to ZIP archive 
     zip.Add(@"c:\temp\testfile.txt"); 
     zip.Add(@"c:\temp\innerfile.txt", @"\subfolder"); 

     // clear response stream and set the response header and content type 
     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AddHeader("content-disposition", "filename=sample.zip"); 

     // write content of the MemoryStream (created ZIP archive) to the response stream 
     ms.WriteTo(Response.OutputStream); 
    } 
} 

// close the current HTTP response and stop executing this page 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
0

は、.NET Frameworkの4.5以降、あなたを使用している場合サードパーティライブラリを避けて、System.IO.Compression.ZipArchiveネイティブクラスを使用することができます。

はここでのMemoryStreamと2つのファイルを表すバイト配列のカップルを使用して迅速なコードサンプルです:

byte[] file1 = GetFile1ByteArray(); 
byte[] file2 = GetFile2ByteArray(); 

using (MemoryStream ms = new MemoryStream()) 
{ 
    using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true)) 
    { 
     var zipArchiveEntry = archive.CreateEntry("file1.txt", CompressionLevel.Fastest); 
     using (var zipStream = zipArchiveEntry.Open()) zipStream.Write(file1, 0, file1.Length); 
     zipArchiveEntry = archive.CreateEntry("file2.txt", CompressionLevel.Fastest); 
     using (var zipStream = zipArchiveEntry.Open()) zipStream.Write(file2, 0, file2.Length); 
    } 
    return File(ms.ToArray(), "application/zip", "Archive.zip"); 
} 

あなたはActionResultを返すMVCコントローラの内部でそれを使用することができます:あなたがphisically作成する必要がある場合は、代わりにzipアーカイブを使用する場合は、MemoryStreamをディスクに保存するか、または完全に置き換えてFileStreamと置き換えることができます。

このトピックに関する詳細については、read this postもご覧ください。

関連する問題