16

SharpZipLibライブラリを使用して次のコードを使用して、ファイルを .zip ファイルに追加していますが、各ファイルはフルパスで保存されています。.zip ファイルの「ルート」にファイルを保存するだけで済みます。

string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
     zipFile.BeginUpdate();
     foreach (string file in files)
     {
          zipFile.Add(file);
     }
     zipFile.CommitUpdate();
}

提供されたドキュメントで、このオプションについて何も見つかりません。これは非常に人気のあるライブラリなので、これを読んでいる人が何か知っていることを願っています.

4

3 に答える 3

24

私の解決策は、NameTransformオブジェクトのプロパティZipFileを aに設定し、ZipNameTransformそのTrimPrefixセットをファイルのディレクトリに設定することでした。これにより、完全なファイル パスであるエントリ名のディレクトリ部分が削除されます。

public static void ZipFolderContents(string folderPath, string zipFilePath)
{
    string[] files = Directory.GetFiles(folderPath);
    using (ZipFile zipFile = ZipFile.Create(zipFilePath))
    {
        zipFile.NameTransform = new ZipNameTransform(folderPath);
        foreach (string file in files)
        {
            zipFile.BeginUpdate();
            zipFile.Add(file);
            zipFile.CommitUpdate();
        }
    }
}

すばらしいのは、 NameTransform プロパティが typeINameTransformであり、名前の変換をカスタマイズできることです。

于 2008-10-14T12:11:13.730 に答える
12

System.IO.Path.GetFileName()を ZipFile.Add() の entryName パラメータと組み合わせて使用​​するのはどうですか?

string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
     zipFile.BeginUpdate();
     foreach (string file in files)
     {
          zipFile.Add(file, System.IO.Path.GetFileName(file));
     }
     zipFile.CommitUpdate();
}
于 2008-10-13T17:12:29.537 に答える
4

の MSDN エントリにDirectory.GetFiles()は、返されたファイル名が指定されたパス パラメーターに追加されていることが示されています。http://msdn.microsoft.com/en-us/library/07wt70x2.aspx)、zipFile.Add()パスを含むために渡す文字列。

SharpZipLib のドキュメントによると、Add メソッドのオーバーロードがあり、

public void Add(string fileName, string entryName) 
Parameters:
  fileName(String) The name of the file to add.
  entryName (String) The name to use for the ZipEntry on the Zip file created.

このアプローチを試してください:

string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
     zipFile.BeginUpdate();
     foreach (string file in files)
     {
          zipFile.Add(file, Path.GetFileName(file));
     }
     zipFile.CommitUpdate();
}
于 2008-10-13T17:12:40.940 に答える