1

私はSharpZipLibZipEntryを使用してファイルを zipfile に追加するツールに取り組んでおり、必要なメタデータを保存するためのコメントを付けています。(これらのメタデータを処理する方法が他にもあることは知っていますが、回避できるのであれば、ソリューションの再設計は避けたいと思います。)

ファイルとメタデータを zipfile に書き込むために使用される [少し簡略化された] コードは次のとおりです。

public static void AddFileToZip(string path, Guid metadata)
{
    using (ZipFile zipFile = new ZipFile(__zipName))
    {
        zipFile.BeginUpdate();
        zipFile.Add(path);
        zipFile.CommitUpdate();
        zipFile.Close();
    }
    // Close and reopen the ZipFile so it can find the ZipEntry:
    using (ZipFile zipFile = new ZipFile(__zipName))
    {
        string cleanPath = ZipEntry.CleanName(path);
        zipFile.BeginUpdate();
        zipFile.GetEntry(cleanPath).Comment = metadata.ToString("N");
        zipFile.CommitUpdate();
        zipFile.Close();
    }
}

このためのテスト ハーネスは次のようになります。

[Test]
public void ArchiveCreationTests()
{
    // Hard-code some variables
    string testFile = @"C:\Users\owen.blacker\Pictures\Ddraig arian.png";
    Guid guid = Guid.NewGuid();

    MyClassName.AddFileToZip(testFile, guid);
    Assert.IsTrue(File.Exists(__zipName), "File does not exist: " + __zipName);

    string cleanName = ZipEntry.CleanName(testFile);
    ZipFile zipfile = new ZipFile(__zipName);
    Assert.GreaterOrEqual(
        zipfile.FindEntry(cleanName, true),
        0,
        "Cannot file ZipEntry " + cleanName);

    ZipEntry zipEntry = zipfile.GetEntry(cleanName);
    StringAssert.AreEqualIgnoringCase(
        guid.ToString("N"),
        zipEntry.Comment,
        "Cannot validate GUID comment.");
}

これで zipfile が作成されました — 実際にテスト イメージが含まれていますDdraig arian.pngZipEntryは正常に検出されていますが、StringAssert呼び出しは常に失敗しています。書き込まれていないために失敗しているのか、読み取られていないために失敗しているのか、完全にはわかりません。

にアクセスするには / を使用ZipFileする必要があることはわかっていますが、 と を使用しているため、なぜ機能しないのかわかりません。ZipEntryZipEntry.CommentZipInputStreamCommentZipFileZipEntry

誰にもアイデアはありますか?

(ファイル インデックスにまだ書き込まれていない可能性AddFileToZipがあるため、ZipFile.GetEntry呼び出しが常に失敗していたため、少し奇妙に閉じて再度開くことができます。そして、はい、私のテスト ファイルは確かにシルバー ドラゴンです。)ZipEntry

4

3 に答える 3

3

ええ、私が知る限り、これはそのままでは機能しません。コメントは書き込まれておらず、ライブラリの現在の反復は与えられません。

私はこのライブラリをまったく使用していませんが、ソース コードの検査を行っています。

ここのソース コードを見ると、contentsEdited の場合にのみ更新が実行されることがわかります。うーん。何がそれを設定するのだろうか?犯人の可能性が高いようです。

周りを検索すると、コメントアウトされたコードに次の疑わしいコメントが添付されていることがわかります

/* Modify not yet ready for public consumption.
   Direct modification of an entry should not overwrite original data before its read.

そして、一般的にソース コードを検索すると、エントリの変更に関する多くの未完成の破片が見つかります。

基本的に、あなたが打っているのは、あなたが望むことをしない半分完成したライブラリだと思います。ごめん。:-)

残念ながら、いくつかの追加のコード考古学により、最初にファイルを追加するときにコメントを書き込む方法がわかりません。更新をコミットする前に、どうにかして ZipEntry オブジェクトを釣り上げることで、何かを一緒にハックすることは可能かもしれませんが、どうすれば私を逃れることができますか?

于 2012-12-10T20:19:51.153 に答える
2

DotNetZipを使用できますか?多くの場合、使いやすいと思います。ZipEntryコメントを機能させることができました。以下を参照してください。

DotNetZipの使用:

using (ZipFile zip = new ZipFile(__zipName))
{
    string testFile = @"...";
    ZipEntry newEntry = zip.AddFile(testFile);
    newEntry.Comment = "test";
    zip.Save();
}
using (ZipFile zip = new ZipFile(__zipName))
{
    Console.WriteLine(zip[0].Comment);
}

SharpZipLibは完全にはサポートしていないようですZipEntry.Comment。そこでの良い調査については@DRMacIverの回答を参照してください。私も複数の方法を試しましたが、理解できません(コメントを設定して保存することはできますが、もう一度読むとヌル)。

なぜ機能しないのかわかりませんが、標準のzifileがファイルのコメントをサポートしておらず、zipファイル全体のコメントが1つしかないためだと思います。だから私は彼らがそれをサポートするためにzipを拡張しているのではないかと思っています。

無関係ですが、以前にテストを行ったことがあり、SharpZipLibはわずかに優れた圧縮を実現できましたが、DotNetZipの使いやすさは、それでも私にとってより優れたソリューションでした。

SharpZipLibを使用してDotNetZipで作成されたzipファイルを読み取り、コメント付きで読み取りまたは書き込みに問題があるかどうかを確認したことはありません(これについては興味があります)

于 2012-12-10T21:45:32.430 に答える
0

コードは公開されています。これを変更するだけで済みます... File ZipFile.cs行で(私にとっては1810)

このサンプルは IStaticDataSource 用です...他のメソッドの場合は他のメソッドを変更します:)

/// <summary>
/// Add a file entry with data.
/// </summary>
/// <param name="dataSource">The source of the data for this entry.</param>
/// <param name="entryName">The name to give to the entry.</param>
/// <param name="compressionMethod">The compression method to use.</param>
/// <param name="useUnicodeText">Ensure Unicode used for name/comments for this entry.</param>
/// <param name="comment">Comentario</param>
public void Add(IStaticDataSource dataSource, string entryName,
    CompressionMethod compressionMethod, bool useUnicodeText, string comment)
{
    if (dataSource == null)
    {
        throw new ArgumentNullException("dataSource");
    }

    if (entryName == null)
    {
        throw new ArgumentNullException("entryName");
    }

    CheckUpdating();

    ZipEntry entry = EntryFactory.MakeFileEntry(entryName, false);
    entry.IsUnicodeText = useUnicodeText;
    entry.CompressionMethod = compressionMethod;
    entry.Comment = comment;

    AddUpdate(new ZipUpdate(dataSource, entry));
}
于 2015-05-13T12:32:24.493 に答える