2

必要なタイプのファイルが含まれている可能性のある zip ファイルがありますが、まだわかりません。これらのファイルを (解凍して) メモ帳で開くと、最初の 8 文字は常に同じです。ファイル全体 (潜在的に数 GB のサイズ) を解凍せずに、最初の 8 文字が一致するかどうかを調べる方法はありますか?

ファイルは多くの場合 4 GB を超えており、deflate64 を使用して圧縮されている可能性があります。これは、SharpZipLib または DotNetZip を使用できないことを意味します。両方を試してみましたが、同じファイルで失敗しました。

次の方法でsevenzipsharpを使用しようとしましたが、すべてのファイルの先頭にゼロしかありませんでした。また、 e.Cancel はキャンセルしなかったため、とにかく全体を mstream に解凍することになりました。これは避けたいと思います。

SevenZipExtractor extractor = new SevenZipExtractor(zipfilename);

foreach (ArchiveFileInfo info in extractor.ArchiveFileData)
{
    bool isMyFileType = false;
    MemoryStream mstream = new MemoryStream();

    extractor.Extracting += (object sender, ProgressEventArgs e) =>
    {
        if (e.PercentDone * info.Size / 100 > 32)
        {
            // read the first 32 bytes
            byte[] buffer = new byte[32];

            if (mstream.Length >= 32)
                mstream.Read(buffer, 0, 32);
            else
                mstream.Read(buffer, 0, (int)mstream.Length);

            //bung the buffer into a streamreader
            MemoryStream memstream = new MemoryStream(buffer);
            StreamReader file = new StreamReader(memstream);

            //read the stream
            string filestart = "";
            for (int i = 0; i < 8; i++)
            {
                if (!file.EndOfStream)
                {
                    filestart = filestart + ((char)file.Read()).ToString();
                }                
            }

            isMyFileType = (filestart == "My8chars");

            e.Cancel = true;
        }
    };

    await CheckForMyFileType(info, mstream, extractor);


    if (isMyFileType)
    {
        //do stuff if it's the right file type

private Task CheckForMyFileType(ArchiveFileInfo info, MemoryStream mstream, SevenZipExtractor extractor)
{
    TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();

    extractor.ExtractFile(info.FileName, mstream);

    tcs.SetResult(true);
    return tcs.Task;
}
4

0 に答える 0