C#で圧縮されたフォルダの内容を一覧表示するにはどうすればよいですか? たとえば、圧縮されたフォルダーに含まれるアイテムの数とその名前を知るにはどうすればよいでしょうか?
8 に答える
.NET 4.5 以降には、最終的にSystem.IO.Compression.ZipArchive
クラス ( http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110% 29.aspx ) アセンブリの 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);
}
}
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...
}
}
.Net Framework 3.0 以降を使用している場合は、System.IO.Packaging Namespaceを確認してください。これにより、外部ライブラリへの依存が削除されます。
特にZipPackage Classを確認してください。
SharpZipLibにチェックインする
ZipInputStream inStream = new ZipInputStream(File.OpenRead(fileName));
while (inStream.GetNextEntry())
{
ZipEntry entry = inStream.GetNextEntry();
//write out your entry's filename
}
Ick-J#ランタイムを使用するそのコードは恐ろしいです!そして、それが最善の方法であることに同意しません-J#は現在サポートされていません。そして、ZIPサポートだけが必要な場合、これは巨大なランタイムです。
これはどうですか-DotNetZip(無料、MS-パブリックライセンス)を使用しています
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);
}
}
あなたが私のようで、外部コンポーネントを使用したくない場合は、.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 つの回答があり、そのうち 2 つの最良の回答が投票で却下されました。(Pearcewg および cxfx) pearcewg によって指摘された記事は、SharpZipLib に関するいくつかのライセンスの問題を明らかにしているため、重要です。最近、いくつかの .Net 圧縮ライブラリを評価した結果、DotNetZip が現時点で最良の代替手段であることがわかりました。
非常に短い要約:
System.IO.Packaging は、DotNetZip よりも大幅に低速です。
SharpZipLib は GPL です - 記事を参照してください。
手始めに、私はこれら2つの回答に投票しました。
キム。
最善の方法は、MSDN: http://msdn.microsoft.com/en-us/magazine/cc164129.aspxに示されているように、.NET に組み込まれた J# zip 機能を使用することです。このリンクには、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 には正しいポインターがありましたが、問題があります。具体的には、zip ファイルを開く際に問題が発生する可能性がありますが、パッケージを作成するだけの場合は有効な解決策です。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: http://msdn.microsoft.com/en-us/magazine/cc164129.aspxに示すように、最善の方法は J# を使用するようです。
この記事には、SharpNetZip や DotNetZip のように、ライセンスが異なるその他の c# .zip ライブラリへのポインタがあります: how to read files from uncompressed zip in c#? . ライセンス要件のために不適切な場合があります。