2012-01-06 13 views
4

これは難しいとは思いませんが、動作させることができませんでした。私はzipしたいファイルの場所、ディレクトリ、名前だけを格納するファイルクラスを持っています。私が圧縮しているファイルはディスク上に存在し、FileLocationは完全なパスです。 ZipFileDirectoryはディスク上に存在しません。私は私のファイルリスト内の2つの項目、DotNetZip:動的に作成されたアーカイブディレクトリにファイルを追加する

{ FileLocation = "path/file1.doc", ZipFileDirectory = @"\", FileName = "CustomName1.doc" }, 

{ FileLocation = "path/file2.doc", ZipFileDirectory = @"\NewDirectory", FileName = "CustomName2.doc" } 

を持っている場合、私はルートにMyCustomName1.docを見ることを期待し、MyCustomName2.docを含むNewDirectoryという名前のフォルダが、何が起こるかは、彼らの両方がルートに終わるされます私はこれを使用する場合

using (var zip = new Ionic.Zip.ZipFile()) 
{ 
    foreach (var file in files) 
    { 
     zip.AddFile(file.FileLocation, file.ZipFileDirectory).FileName = file.FileName; 
    } 

    zip.Save(HttpContext.Current.Response.OutputStream); 
} 

zip.AddFiles(files.Select(o => o.FileLocation), false, "NewDirectory"); 

を次に、それは、新しいディレクトリを作成し、予想通り、内部のすべてのファイルを置きますが、その後、私はCを使用する能力を失い、このコードを使用してこのメソッドを使ってネーミングを行い、最初のメソッドが完全に扱う複雑さも導入します。

私が期待するように最初のメソッド(AddFile())を動作させる方法はありますか?

+0

私はDotNetZipのコードを探しています、そしてADDFILE()は、実際の作業では、あなたが期待するべきであるとことが表示されます。私は 'FileName'を" NewDirectory \ CustomName2.doc "に設定しなければならないという仮説を検討していましたが、これはコードではサポートされていません。ただし、これはバージョンに依存している可能性があります(おそらくバグ)。どのバージョンを使用していますか? – phoog

答えて

7

、数分前にコメントを投稿するので、私はFileNameを設定するとアーカイブパスを消去していると思われます。

テストによってこれが確認されます。

名前を@ "NewDirectory \ CustomName2.doc"に設定すると、問題が解決されます。

ます。また、使用することができます@「\ NewDirectory CustomName2.doc \」

0

あなたのニーズに合っているかどうかは分かりませんが、分かち合うと思います。これは私の開発チームにとってDotNetZipで作業するのを少し容易にするために作成したヘルパークラスの一部であるメソッドです。 IOHelperクラスは無視することができる別の簡単なヘルパークラスです。さらに検査で

/// <summary> 
    /// Create a zip file adding all of the specified files. 
    /// The files are added at the specified directory path in the zip file. 
    /// </summary> 
    /// <remarks> 
    /// If the zip file exists then the file will be added to it. 
    /// If the file already exists in the zip file an exception will be thrown. 
    /// </remarks> 
    /// <param name="filePaths">A collection of paths to files to be added to the zip.</param> 
    /// <param name="zipFilePath">The fully-qualified path of the zip file to be created.</param> 
    /// <param name="directoryPathInZip">The directory within the zip file where the file will be placed. 
    /// Ex. specifying "files\\docs" will add the file(s) to the files\docs directory in the zip file.</param> 
    /// <param name="deleteExisting">Delete the zip file if it already exists.</param> 
    public void CreateZipFile(ICollection<FileInfo> filePaths, string zipFilePath, string directoryPathInZip, bool deleteExisting) 
    { 
     if (deleteExisting) 
     { 
      IOHelper ioHelper = new IOHelper(); 
      ioHelper.DeleteFile(zipFilePath); 
     } 

     using (ZipFile zip = new ZipFile(zipFilePath)) 
     { 
      foreach (FileInfo filePath in filePaths) 
      { 
       zip.AddFile(filePath.FullName, directoryPathInZip); 
      } 
      zip.Save(); 
     } 
    }  
関連する問題