zipファイル内のパスを無視して特定のフォルダーにファイルを抽出しようとしましたが、方法がないようです。
そこに実装されている他のすべての優れたものを考えると、これはかなり基本的な要件のようです。
私は何が欠けていますか?
コードは-
using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
zf.ExtractAll(appPath);
}
Extract()
またはへの特定の呼び出しに対して指定することはできませんがExtractAll()
、ZipFile
クラスにはFlattenFoldersOnExtract
フィールドがあります。trueに設定すると、抽出されたすべてのファイルが1つのフォルダーにフラット化されます。
var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
解凍する直前に、ファイル名のディレクトリ部分を削除する必要があります...
using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
zf.ToList().ForEach(entry =>
{
entry.FileName = System.IO.Path.GetFileName(entry.FileName);
entry.Extract(appPath);
});
}
ストリームをパラメータとして受け取るオーバーロードを使用できます。このようにして、ファイルが抽出されるパスを完全に制御できます。
例:
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);
}
}
}
同じファイル名のファイルが2つある場合は、失敗します。たとえば、files \ additionalfiles \ file1.txt temp \ file1.txt
最初のファイルはzipファイルでfile1.txtに名前が変更され、2番目のファイルの名前が変更されようとすると、同じキーを持つアイテムが既に存在するという例外がスローされます。