web-dev-qa-db-ja.com

.Zipフォルダーの内容をC#で一覧表示するにはどうすればよいですか?

C#で圧縮フォルダーの内容を一覧表示するにはどうすればよいですか?たとえば、zipフォルダー内に含まれているアイテムの数とその名前を知る方法は?

29
vbroto

DotNetZip -.NET言語でのZipファイル操作

DotNetZipは、.Zipファイルを操作するための小さくて使いやすいクラスライブラリです。 VB.NET、C#、任意の.NET言語で記述された.NETアプリケーションが、Zipファイルを簡単に作成、読み取り、更新できるようにします。

zipを読み取るためのサンプルコード:

using (var Zip = ZipFile.Read(PathToZipFolder))
{
    int totalEntries = Zip.Entries.Count; 
    foreach (ZipEntry e in Zip.Entries)
    {
        e.FileName ...
        e.CompressedSize ...
        e.LastModified...
    }
}
33
Chris Fulstow

.NET 4.5以降には、System.IO.Compression.ZipArchiveクラス( http://msdn.Microsoft.com/en-us/library/system.io.compression)を使用して汎用Zipファイルを処理する機能が組み込まれました.ziparchive%28v = vs.110%29.aspx )(Assembly System.IO.Compression内)。サードパーティのライブラリは必要ありません。

string zipPath = @"c:\example\start.Zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        Console.WriteLine(entry.FullName);
    }
} 
26
Csaba Toth

.Net Framework 3.0以降を使用している場合は、 System.IO.Packaging Namespace を確認してください。これにより、外部ライブラリへの依存がなくなります。

特に ZipPackage Class を確認してください。

21
Adrian Clark

チェックイン SharpZipLib

ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));

while (inStream.GetNextEntry())
{

     ZipEntry entry = inStream.GetNextEntry();
     //write out your entry's filename
}
12
Chris Ballance

Ick-J#ランタイムを使用するコードは恐ろしいです!そして、それが最善の方法であることに同意しません-J#は現在サポートされていません。そして、もしあなたが望むのがZipサポートさえあれば、それは巨大なランタイムです。

これはどうですか? DotNetZip を使用します(無料、MS-Publicライセンス)

using (ZipFile Zip = ZipFile.Read(zipfile) )
{
    bool header = true;
    foreach (ZipEntry e in Zip)
    {
        if (header)
        {
            System.Console.WriteLine("Zipfile: {0}", Zip.Name);
            if ((Zip.Comment != null) && (Zip.Comment != ""))
                System.Console.WriteLine("Comment: {0}", Zip.Comment);

            System.Console.WriteLine("\n{1,-22} {2,9}  {3,5}   {4,9}  {5,3} {6,8} {0}",
                                     "Filename", "Modified", "Size", "Ratio", "Packed", "pw?", "CRC");
            System.Console.WriteLine(new System.String('-', 80));
            header = false;
        }

        System.Console.WriteLine("{1,-22} {2,9} {3,5:F0}%   {4,9}  {5,3} {6:X8} {0}",
                                 e.FileName,
                                 e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                                 e.UncompressedSize,
                                 e.CompressionRatio,
                                 e.CompressedSize,
                                 (e.UsesEncryption) ? "Y" : "N",
                                 e.Crc32);

        if ((e.Comment != null) && (e.Comment != ""))
            System.Console.WriteLine("  Comment: {0}", e.Comment);
    }
}
6
Cheeso

私はここで比較的新しいので、何が起こっているのか理解していないかもしれません。 :-)現在、このスレッドには4つの回答があり、2つのベストアンサーが投票されました。 (Pearcewgとcxfxの)pearcewgによって指摘された記事は、SharpZipLibのいくつかのライセンス問題を明確にするため、重要です。最近、いくつかの.Net圧縮ライブラリを評価したところ、DotNetZipが現在最高の代替手段であることがわかりました。

非常に短い要約:

  • System.IO.Packagingは、DotNetZipよりもかなり低速です。

  • SharpZipLibはGPLです-記事を参照してください。

だから、まず第一に、私はそれらの2つの答えに投票した。

キム。

4
Kim Major

私のようで、外部コンポーネントを使用したくない場合は、昨夜.NETのZipPackageクラスを使用して開発したコードをいくつか示します。

var zipFilePath = "c:\\myfile.Zip";
var tempFolderPath = "c:\\unzipped";

using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
    foreach (PackagePart part in package.GetParts())
    {
        var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
        var targetDir = target.Remove(target.LastIndexOf('\\'));

        if (!Directory.Exists(targetDir))
            Directory.CreateDirectory(targetDir);

        using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
        {
            source.CopyTo(File.OpenWrite(target));
        }
    }
}

注意事項:

  • Zipアーカイブのルートには、[Content_Types] .xmlファイルが必要です。このコードで抽出されたZipファイルの圧縮を制御するため、これは私の要件では問題ではありませんでした。 [Content_Types] .xmlファイルの詳細については、以下を参照してください。 データをパッケージ化するための新しい標準 記事の図13の下にサンプルファイルがあります。

  • このコードは、.NET 4.0のStream.CopyToメソッドを使用します。

4
Joshua

最良の方法は、MSDNに示されているように、JNETに組み込まれた.NET機能を使用することです http://msdn.Microsoft.com/en-us/magazine/cc164129.aspx 。このリンクには、Zipファイルの読み取りと書き込みを行うアプリケーションの完全な動作例があります。 Zipファイル(この場合はSilverlight .xapアプリケーションパッケージ)の内容を一覧表示する具体的な例では、コードは次のようになります。


ZipFile package = new ZipFile(packagePath);
Java.util.Enumeration entries = package.entries();
//We have to use Java enumerators because we
//use Java.util.Zip for reading the .Zip files
while ( entries.hasMoreElements() )
{
    ZipEntry entry = (ZipEntry) entries.nextElement();

    if (!entry.isDirectory())
    {
        string name = entry.getName();
        Console.WriteLine("File: " + name + ", size: " + entry.getSize() + ", compressed size: " + entry.getCompressedSize());
    }
    else
    {
        // Handle directories...
    }                        
}

Aydsmanには正しいポインタがありましたが、 problems があります。具体的には、Zipファイルを開くときに問題が発生する可能性がありますが、パッケージをonly作成する場合は有効な解決策です。 ZipPackageは、抽象Packageクラスを実装し、Zipファイルの操作を可能にします。 MSDNにその方法のサンプルがあります: http://msdn.Microsoft.com/en-us/library/ms771414.aspx 。おおよそのコードは次のようになります。

             string packageRelationshipType = @"http://schemas.Microsoft.com/opc/2006/sample/document";
            string resourceRelationshipType = @"http://schemas.Microsoft.com/opc/2006/sample/required-resource";
            // Open the Package.
            // ('using' statement insures that 'package' is
            //  closed and disposed when it goes out of scope.)
            foreach (string packagePath in downloadedFiles)
            {
                Logger.Warning("Analyzing " + packagePath);
                using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.Read))
                {
                    Logger.OutPut("package opened");
                    PackagePart documentPart = null;
                    PackagePart resourcePart = null;

                    // Get the Package Relationships and look for
                    //   the Document part based on the RelationshipType
                    Uri uriDocumentTarget = null;
                    foreach (PackageRelationship relationship in
                        package.GetRelationshipsByType(packageRelationshipType))
                    {
                        // Resolve the Relationship Target Uri
                        //   so the Document Part can be retrieved.
                        uriDocumentTarget = PackUriHelper.ResolvePartUri(
                            new Uri("/", UriKind.Relative), relationship.TargetUri);

                        // Open the Document Part, write the contents to a file.
                        documentPart = package.GetPart(uriDocumentTarget);
                        //ExtractPart(documentPart, targetDirectory);
                        string stringPart = documentPart.Uri.ToString().TrimStart('/');
                        Logger.OutPut("  Got: " + stringPart);
                    }

                    // Get the Document part's Relationships,
                    //   and look for required resources.
                    Uri uriResourceTarget = null;
                    foreach (PackageRelationship relationship in
                        documentPart.GetRelationshipsByType(
                                                resourceRelationshipType))
                    {
                        // Resolve the Relationship Target Uri
                        //   so the Resource Part can be retrieved.
                        uriResourceTarget = PackUriHelper.ResolvePartUri(
                            documentPart.Uri, relationship.TargetUri);

                        // Open the Resource Part and write the contents to a file.
                        resourcePart = package.GetPart(uriResourceTarget);

                        //ExtractPart(resourcePart, targetDirectory);
                        string stringPart = resourcePart.Uri.ToString().TrimStart('/');
                        Logger.OutPut("  Got: " + stringPart);
                    }

                }
            }

MSDNに示されているように、最善の方法はJ#を使用しているようです: http://msdn.Microsoft.com/en-us/magazine/cc164129.aspx

この記事のSharpNetZipやDotNetZipのように、さまざまなライセンスを持つより多くのc#.Zipライブラリへのポインタがあります。 c#で圧縮されていないZipからファイルを読み取る方法 。ライセンス要件のため、これらは不適切な場合があります。

0
vbroto