将Zip File转换为byte[],将byte[]转换为Zip File

本文关键字:byte Zip File 转换 | 更新日期: 2023-09-27 18:08:21

我尝试将zip文件转换为byte[]并将其写入文本文件。

int BufferSize=65536;
private void button1_Click(object sender, EventArgs e)
{
    DialogResult re = openFileDialog1.ShowDialog();
    if (re == DialogResult.OK)
    {
        string fileName = openFileDialog1.FileName;
        try
        {
            byte[] bytes = File.ReadAllBytes(fileName);
            File.WriteAllBytes(@"F:'Info.txt", bytes);
        }
        catch (Exception) { }
    }
}   

然后我尝试将这些字节转换为zip文件。但是我做不到。

我的代码在这里:

private void button2_Click(object sender, EventArgs e)
{
    DialogResult re = openFileDialog1.ShowDialog();
    if (re == DialogResult.OK)
    {
        string fileName = openFileDialog1.FileName;
        try
        {
            byte[] bytes = File.ReadAllBytes(fileName);
            using (var mstrim = new MemoryStream(bytes))
            {
                using (var inStream = new GZipStream(mstrim, CompressionMode.Compress))
                {
                    using (var outStream = File.Create("Tax.Zip"))
                    {
                        var buffer = new byte[BufferSize];
                        int readBytes;
                        while ((readBytes = inStream.Read(buffer, 0, BufferSize)) != 0)
                        {
                            outStream.Write(buffer, 0, readBytes);
                        }
                    }
                }
            }
        }
        catch (Exception) { }
    }
}

错误:File Mode not valid.

需要什么样的文件模式,我怎样才能完成我所描述的?

将Zip File转换为byte[],将byte[]转换为Zip File

试试这个

            byte[] data = File.ReadAllBytes("D:''z.7z");
            File.WriteAllBytes("D:''t.txt", data); // Requires System.IO
            byte[] newdata = File.ReadAllBytes("D:''t.txt");
            File.WriteAllBytes("D:''a.7z", newdata); // Requires System.IO

您使用的是GZipStream,它用于GZip文件,而不是(PK-)Zip文件。显然,这是行不通的。尝试ZipFile类代替(虽然遗憾的是,它不能在流上工作,只能在文件上工作)。

除了是一种不同的文件格式之外,最大的区别是GZip只用于压缩,而Zip也是一种存档(也就是说,它可以包含多个文件)。

试试这个,

private void button1_Click(object sender, EventArgs e)
    {
         byte[] arr;
            MemoryStream ms = new MemoryStream();
            arr = File.ReadAllBytes("C:''asik.zip");
            File.WriteAllBytes(@"D:''asik.txt", arr);
            ms.Close();
            FileStream stream = File.OpenRead(@"D:''asik.txt");
            byte[] fileBytes = new byte[stream.Length];
            stream.Read(fileBytes, 0, fileBytes.Length);
            stream.Close();
            MemoryStream ms1 = new MemoryStream(fileBytes);
            CreateToMemoryStream(ms1, @"D:''asik.zip");
            ms1.Close();

    }
    public void CreateToMemoryStream(MemoryStream memStreamIn, string zipEntryName)
    {
        MemoryStream outputMemStream = new MemoryStream();
        ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);
        zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
        ZipEntry newEntry = new ZipEntry(zipEntryName);
        newEntry.DateTime = DateTime.Now;
        zipStream.PutNextEntry(newEntry);
        StreamUtils.Copy(memStreamIn, zipStream, new byte[4096]);
        zipStream.CloseEntry();
        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();          // Must finish the ZipOutputStream before using outputMemStream.
        //outputMemStream.Position = 0;
        //return outputMemStream;
        //// Alternative outputs:
        //// ToArray is the cleaner and easiest to use correctly with the penalty of duplicating allocated memory.
        //byte[] byteArrayOut = outputMemStream.ToArray();
        //// GetBuffer returns a raw buffer raw and so you need to account for the true length yourself.
        //byte[] byteArrayOut2 = outputMemStream.GetBuffer();
        //long len = outputMemStream.Length;
    }
public class BytesVal {
    public static void main(String[] args) throws IOException, MoreZipException {
        // TODO Auto-generated method stub
        File file = new File("F:''ssd''doc''");
        System.out.println("Byte inside the Zip file is" + BytesVal.getAllBytes(file));
    }
    public static byte[] getAllBytes(File folderName) throws IOException, MoreZipException {
        String[] sourceFiles = null;
        if (folderName.isDirectory()) {
            sourceFiles = folderName.list();
            if (sourceFiles.length > 1) {
                throw new MoreZipException(sourceFiles.length);
            }
        }
        byte[] bytes = null;
        Path filePath = Paths.get("F:/ssd/doc/" + sourceFiles[0]);
        bytes = Files.readAllBytes(filePath);
        return bytes;
    }
}