C# 如何将编码的Base64 zip文件解码为新的zip文件?

C# 如何将编码的Base64 zip文件解码为新的zip文件?,c#,.net-core,base64,zip,C#,.net Core,Base64,Zip,我试图用编码的base64字符串创建一个zip文件,但我一直无法从该字符串获取文件 我已经能够用它创建zip文件,但是我没有看到应该在其中的文件 到目前为止,我的代码是: public static void Main(string[] args) { IConfiguration config = new ConfigurationBuilder() .AddJsonFile("appsettings.json", false, true) .Build

我试图用编码的base64字符串创建一个zip文件,但我一直无法从该字符串获取文件

我已经能够用它创建zip文件,但是我没有看到应该在其中的文件

到目前为止,我的代码是:

public static void Main(string[] args)
{
    IConfiguration config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", false, true)
        .Build();

    var fileName = args[0];
    var path = $"{config["zipPath"]}\\{fileName}";

    byte[] zipBytes = Convert.FromBase64String(args[1]);
    using(var memoryStream = new MemoryStream(zipBytes))
    {
        // without this I can't open my zip file
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
        {
        }

        using (var fileStream = new FileStream(path, FileMode.Create))
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.CopyTo(fileStream);
        }
   }
}
澄清

我正在解码的字符串是一个经过编码的zip文件。我得到Base64字符串,我需要解码它并创建一个与原始文件相同的zip文件,包括压缩的文件

进一步澄清

我从第三方收到一个zip文件。但是,我不是以zip文件的形式接收它,而是以编码的Base64字符串的形式接收它。该zip的字节被编码为Base64字符串。
我需要做的是使用我收到的Base64字符串重新创建原始zip文件。

读取文件中的所有文本:

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
然后将文本文件中的base64字符串转换为字节

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
然后您可以将这些字节写入zip文件

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
如果要在内存中提取,只需将其加载到memorystream中

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}

读取文件中的所有文本:

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
然后将文本文件中的base64字符串转换为字节

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
然后您可以将这些字节写入zip文件

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}
如果要在内存中提取,只需将其加载到memorystream中

例如:

string text = System.IO.File.ReadAllText(@"C:\demofile.txt");
byte[] bytes = Convert.FromBase64String(text);
File.WriteAllBytes(@"C:\demofile_zip.zip", bytes);
using (var compressedStream = new MemoryStream(bytes2))
{
    using (FileStream decompressedFileStream = File.Create(@"C:\demofile_installer.msi"))
    {
        using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
        {
            decompressionStream.CopyTo(decompressedFileStream);
        }
    }
}

你得到的是什么类型的文件根本不重要,因为你会收到一个二进制表示和文件名。它可以是
.JPG
.VHD
虚拟磁盘、
.MDB
数据库等等

因此,您可以省略memoryStream和Ziparchive,只需将二进制数据写入扩展名为.zip的文件:

  public static void Main(string[] args)
{
    var path = @"c:\temp\fileName2.zip";
    byte[] zipBytes = Convert.FromBase64String("UEsDBBQAAAAIAC5YR063vtp6EwEAALcBAAAJAAAAcHJpbWUudHh0ZZDfSsMwFMbvA3mHPoBCkv5Ze5EL1zkVnBPX2QsRmdtxLWuTkmSyvb0nUaogBHLO73x8+U6eRbIcXKuVLbX6BONgJzkl9c36bvaGvcWRFJSsnAFrK7AOjBesLTyatgcFTjJKFq2qtHFHA/N5JbnIEW1OfxETCSU/YAG9zMeuQhsZB48pqG3j5YIl3xYjyXmBMUJ7bYw2ZQPbg386oKuuK3U/dHDyYZeqOwecZpN81JQaV/DZQ3d7HnDbxsBm9wtrbQ64s+QX6IKeAY4GIShPKbmHDyfjPMv8DoMUeD+1+8bJNGZYT7VzupcFQ2nNJYtYxBMhorgosLzk48GxwLHnQTD5L6DkJfzzA7hXSmbwftz7PF9QSwECFAAUAAAACAAuWEdOt77aehMBAAC3AQAACQAAAAAAAAABACAAAAAAAAAAcHJpbWUudHh0UEsFBgAAAAABAAEANwAAADoBAAAAAA==");
    using (FileStream fs = new FileStream(path, FileMode.Create))
    {
        fs.Write(zipBytes,0,zipBytes.Length);
    }
}
(我以前从.zip创建了base64字符串)


你得到的是什么类型的文件根本不重要,因为你会收到一个二进制表示和文件名。它可以是
.JPG
.VHD
虚拟磁盘、
.MDB
数据库等等

因此,您可以省略memoryStream和Ziparchive,只需将二进制数据写入扩展名为.zip的文件:

  public static void Main(string[] args)
{
    var path = @"c:\temp\fileName2.zip";
    byte[] zipBytes = Convert.FromBase64String("UEsDBBQAAAAIAC5YR063vtp6EwEAALcBAAAJAAAAcHJpbWUudHh0ZZDfSsMwFMbvA3mHPoBCkv5Ze5EL1zkVnBPX2QsRmdtxLWuTkmSyvb0nUaogBHLO73x8+U6eRbIcXKuVLbX6BONgJzkl9c36bvaGvcWRFJSsnAFrK7AOjBesLTyatgcFTjJKFq2qtHFHA/N5JbnIEW1OfxETCSU/YAG9zMeuQhsZB48pqG3j5YIl3xYjyXmBMUJ7bYw2ZQPbg386oKuuK3U/dHDyYZeqOwecZpN81JQaV/DZQ3d7HnDbxsBm9wtrbQ64s+QX6IKeAY4GIShPKbmHDyfjPMv8DoMUeD+1+8bJNGZYT7VzupcFQ2nNJYtYxBMhorgosLzk48GxwLHnQTD5L6DkJfzzA7hXSmbwftz7PF9QSwECFAAUAAAACAAuWEdOt77aehMBAAC3AQAACQAAAAAAAAABACAAAAAAAAAAcHJpbWUudHh0UEsFBgAAAAABAAEANwAAADoBAAAAAA==");
    using (FileStream fs = new FileStream(path, FileMode.Create))
    {
        fs.Write(zipBytes,0,zipBytes.Length);
    }
}
(我以前从.zip创建了base64字符串)


我的建议是使用ZipFile方法


我的建议是使用ZipFile方法


args[1]
中有什么内容?Base64字符串?而
args[0]
?@FalcoAlexander args[0]=压缩文件的名称,args[1]=编码压缩文件的Base64字符串我不能完全理解…您需要创建一个包含Base64字符串的临时文件,并且该文件应该在一个新的.zip文件中?那么你显然遗漏了什么。@FalcoAlexander我只需要zip文件,我希望它与编码为Base64的原始zip文件相同,因此将文件包括在原始zip文件中可能与
args[1]
中的文件重复?Base64字符串?而
args[0]
?@FalcoAlexander args[0]=压缩文件的名称,args[1]=编码压缩文件的Base64字符串我不能完全理解…您需要创建一个包含Base64字符串的临时文件,并且该文件应该在一个新的.zip文件中?那么你显然遗漏了什么。@FalcoAlexander我只需要zip文件,我希望它与编码为Base64的原始zip文件相同,因此将文件包括在原始zip文件中Base64的可能副本已经是一个zip文件。我需要创建一个拉链出来。我没有单独获取它包含的文件base64已经是一个zip。我需要创建一个拉链出来。我没有单独获取它包含的文件这似乎创建了一个新条目,我想要的是原始zip文件的原始条目显然您的问题非常不清楚,另请参见其他答案?不知道你想达到什么目的…是的,很奇怪,但我想我做到了。你确定你得到的Bas64字符串是正确的吗?您的代码在这方面看起来不错,即使我不了解其中的
ZipArchive
的用法。这似乎创建了一个新条目,我想要的是原始zip文件的原始条目显然您的问题很不清楚,另请参见其他答案?不知道你想达到什么目的…是的,很奇怪,但我想我做到了。你确定你得到的Bas64字符串是正确的吗?您的代码在这方面看起来很好,即使我不理解其中的
ZipArchive