11

zipファイル内のパスを無視して特定のフォルダーにファイルを抽出しようとしましたが、方法がないようです。

そこに実装されている他のすべての優れたものを考えると、これはかなり基本的な要件のようです。

私は何が欠けていますか?

コードは-

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ExtractAll(appPath);
}
4

4 に答える 4

24

Extract()またはへの特定の呼び出しに対して指定することはできませんがExtractAll()ZipFileクラスにはFlattenFoldersOnExtractフィールドがあります。trueに設定すると、抽出されたすべてのファイルが1つのフォルダーにフラット化されます。

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
于 2012-02-20T03:33:34.487 に答える
15

解凍する直前に、ファイル名のディレクトリ部分を削除する必要があります...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ToList().ForEach(entry =>
    {
        entry.FileName = System.IO.Path.GetFileName(entry.FileName);
        entry.Extract(appPath);
    });
}
于 2010-03-09T20:56:05.510 に答える
2

ストリームをパラメータとして受け取るオーバーロードを使用できます。このようにして、ファイルが抽出されるパスを完全に制御できます。

例:

using (ZipFile zip = new ZipFile(ZipPath))
{
     foreach (ZipEntry e in zip)
     {
        string newPath = Path.Combine(FolderToExtractTo, e.FileName);

        if (e.IsDirectory)
        {
           Directory.CreateDirectory(newPath);
        }
        else
        {
          using (FileStream stream = new FileStream(newPath, FileMode.Create))
             e.Extract(stream);
        }
     }
}
于 2016-08-29T07:43:28.863 に答える
1

同じファイル名のファイルが2つある場合は、失敗します。たとえば、files \ additionalfiles \ file1.txt temp \ file1.txt

最初のファイルはzipファイルでfile1.txtに名前が変更され、2番目のファイルの名前が変更されようとすると、同じキーを持つアイテムが既に存在するという例外がスローされます。

于 2012-01-04T15:55:54.270 に答える