1

SharpZip lib を使用すると、zip アーカイブからファイルを簡単に抽出できます。

FastZip fz = new FastZip();
string path = "C:/bla.zip";
fz.ExtractZip(bla,"C:/Unzips/",".*");

ただし、これにより、圧縮されていないフォルダーが出力ディレクトリに配置されます。私が欲しい bla.zip 内に foo.txt ファイルがあるとします。それを抽出して出力ディレクトリ(フォルダなし)に配置する簡単な方法はありますか?

4

2 に答える 2

3

FastZipフォルダを変更する方法を提供していないようですが、「手動」の方法でこれをサポートしています

あなたが彼らの例を見てみると:

public void ExtractZipFile(string archiveFilenameIn, string outFolder) {
    ZipFile zf = null;
    try {
        FileStream fs = File.OpenRead(archiveFilenameIn);
        zf = new ZipFile(fs);

        foreach (ZipEntry zipEntry in zf) {
            if (!zipEntry.IsFile) continue; // Ignore directories

            String entryFileName = zipEntry.Name;
            // to remove the folder from the entry:
            // entryFileName = Path.GetFileName(entryFileName);

            byte[] buffer = new byte[4096];     // 4K is optimum
            Stream zipStream = zf.GetInputStream(zipEntry);

            // Manipulate the output filename here as desired.
            String fullZipToPath = Path.Combine(outFolder, entryFileName);
            string directoryName = Path.GetDirectoryName(fullZipToPath);
            if (directoryName.Length > 0)
                Directory.CreateDirectory(directoryName);

            using (FileStream streamWriter = File.Create(fullZipToPath)) {
                StreamUtils.Copy(zipStream, streamWriter, buffer);
            }
        }
    } finally {
        if (zf != null) {
            zf.IsStreamOwner = true;stream
            zf.Close();
        }
    }
}

彼らが指摘するように、書く代わりに:

String entryFileName = zipEntry.Name;

あなたは書ける:

String entryFileName = Path.GetFileName(entryFileName)

フォルダを削除します。

于 2012-08-24T10:56:36.220 に答える
1

これが zip 内の唯一のファイル (フォルダーではない) であることがわかっていると仮定します。

using(ZipFile zip = new ZipFile(zipStm))
{
  foreach(ZipEntry ze in zip)
    if(ze.IsFile)//must be our foo.txt
    {
      using(var fs = new FileStream(@"C:/Unzips/foo.txt", FileMode.OpenOrCreate, FileAccess.Write))
        zip.GetInputStream(ze).CopyTo(fs);
      break;
    }  
}

他の可能性を処理する必要がある場合、またはたとえば zip エントリの名前を取得する必要がある場合は、それに応じて複雑さが増します。

于 2012-08-24T11:01:16.220 に答える