21

1 つ以上のファイルを含む zip ファイルを作成しようとしています。
私は .NET Framework 4.5、より具体的には System.IO.Compression 名前空間を使用しています。
目的は、ユーザーが ASP.NET MVC アプリケーションを介して zip ファイルをダウンロードできるようにすることです。
zip ファイルが生成されてクライアントに送信されますが、ダブルクリックして開こうとすると、次のエラーが表示されます:
Windows はフォルダーを開けません。圧縮 (zip 形式) フォルダー ... は無効です。
これが私のコードです:

[HttpGet]
public FileResult Download()
{
    var fileOne = CreateFile(VegieType.POTATO);
    var fileTwo = CreateFile(VegieType.ONION);
    var fileThree = CreateFile(VegieType.CARROT);

    IEnumerable<FileContentResult> files = new List<FileContentResult>() { fileOne, fileTwo, fileThree };
    var zip = CreateZip(files);

    return zip;
}

private FileContentResult CreateFile(VegieType vType)
{
    string fileName = string.Empty;
    string fileContent = string.Empty;

    switch (vType)
    {
        case VegieType.BATATA:
            fileName = "batata.csv";
            fileContent = "THIS,IS,A,POTATO";
            break;
        case VegieType.CEBOLA:
            fileName = "cebola.csv";
            fileContent = "THIS,IS,AN,ONION";
            break;
        case VegieType.CENOURA:
            fileName = "cenoura.csv";
            fileContent = "THIS,IS,A,CARROT";
            break;
        default:
            break;
    }

    var fileBytes = Encoding.GetEncoding(1252).GetBytes(fileContent);
    return File(fileBytes, MediaTypeNames.Application.Octet, fileName);
}

private FileResult CreateZip(IEnumerable<FileContentResult> files)
{
    byte[] retVal = null;

    if (files.Any())
    {
        using (MemoryStream zipStream = new MemoryStream())
        {
            using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create, false))
            {
                foreach (var f in files)
                {
                    var entry = archive.CreateEntry(f.FileDownloadName, CompressionLevel.Fastest);
                    using (var entryStream = entry.Open())
                    {
                        entryStream.Write(f.FileContents, 0, f.FileContents.Length);
                        entryStream.Close();
                    }
                }

                zipStream.Position = 0;
                retVal = zipStream.ToArray();
            }
        }
    }

    return File(retVal, MediaTypeNames.Application.Zip, "horta.zip");
}

ダブルクリックしたときにzipファイルが無効であるとWindowsが言っているのはなぜですか。
最終的な考慮事項として、7-Zip を使用して開くことができます。

4

4 に答える 4

3

ストリームを返すだけです...

private ActionResult CreateZip(IEnumerable files)
{
    if (files.Any())
    {
        MemoryStream zipStream = new MemoryStream();
        using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create, false))
        {
            foreach (var f in files)
            {
               var entry = archive.CreateEntry(f.FileDownloadName, CompressionLevel.Fastest);
               using (var entryStream = entry.Open())
               {
                   entryStream.Write(f.FileContents, 0, f.FileContents.Length);
                   entryStream.Close();
               }
           }

        }

        zipStream.Position = 0;
        return File(zipStream, MediaTypeNames.Application.Zip, "horta.zip");
    }

    return new EmptyResult();
}
于 2016-10-21T13:25:12.337 に答える
1

変更してみる

using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create, false))

using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))

この使用法では、アーカイブが閉じられると、ストリームへの書き込みが強制されます。ただし、コンストラクターのleaveOpen引数が false に設定されている場合は、基になるストリームも閉じます。

于 2018-02-21T13:11:47.993 に答える