using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace CsExtract
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern void LoadLibrary(String lpFileName);

        static void Main(string[] args)
        {
            if (Environment.Version.Major >= 4)
            {
                String folder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),
                                            @"C:\Windows\Microsoft.NET\Framework\v2.0.50727");
                folder = Path.GetFullPath(folder);
                LoadLibrary(Path.Combine(folder, "vjsnativ.dll"));
            }

            //展開するZIPファイルの設定
            string zipPath = "C:\\test\\test.zip";
            //展開先のフォルダの設定
            string extractDir = "C:\\test\\extra";

            //読み込む
            java.io.FileInputStream fis = new java.io.FileInputStream(zipPath);
            java.util.zip.ZipInputStream zis =
                new java.util.zip.ZipInputStream(fis);
            //ZIP内のファイル情報を取得
            java.util.zip.ZipEntry ze;
            while ((ze = zis.getNextEntry()) != null)
            {
                if (!ze.isDirectory())
                {
                    //ファイル名
                    string fileName = System.IO.Path.GetFileName(ze.getName());
                    //展開先のフォルダ
                    string destDir = System.IO.Path.Combine(
                        extractDir, System.IO.Path.GetDirectoryName(ze.getName()));
                    System.IO.Directory.CreateDirectory(destDir);
                    //展開先のパス
                    string destPath = System.IO.Path.Combine(destDir, fileName);
                    //FileOutputStreamの作成
                    java.io.FileOutputStream fos =
                        new java.io.FileOutputStream(destPath);
                    //書込み
                    sbyte[] buffer = new sbyte[8192];
                    int len;
                    while ((len = zis.read(buffer, 0, buffer.Length)) > 0)
                    {
                        fos.write(buffer, 0, len);
                    }
                    //閉じる
                    fos.close();
                }
            }
            zis.close();
            fis.close();
        }
    }
}