在C# NET 3.5中,如何从byte[]保存文件?

17

我的TCP客户端在一个数据包中接收到一张图片。这张图片被zlib压缩。任务是解压缩图片并将其放置在表单上。

我计划将这个压缩的图片保存在当前目录中,进行解压缩,然后加载解压后的文件到表单上。

第一个问题出现在保存文件(压缩文件)时。zlib可以将其保存为未压缩格式。

下面的代码将加载压缩文件并在解压缩后保存它。

    private void decompressFile(string inFile, string outFile)
    {
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
        System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);          
        try
        {
            CopyStream(inFileStream, outZStream);
        }
        finally
        {
            outZStream.Close();
            outFileStream.Close();
            inFileStream.Close();
        }
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }
如何直接将byte[]数组传递给该函数? 我计划将其保存为压缩文件,然后使用压缩文件的位置调用函数,但我不知道如何从byte[]数组中保存文件,也不知道将byte[]数组作为输入文件传递的方法。 非常感谢您提供的任何帮助。 谢谢。

我不明白你想把 byte[] 传递到哪里?是传递到 CopyStream 函数吗? - Anirudh Goel
同样地,在以下代码中: while ((len = input.Read(buffer, 0, 2000)) > 0) {
output.Write(buffer, 0, len);
} 你不需要重新调整写入缓冲区的位置吗?它总是从位置0开始覆盖。
- Anirudh Goel
1
关于CopyStream函数,它是正确的。你总是想要写到位置0。额外的参数控制从缓冲区的哪个位置复制。但每次循环中我们总是从缓冲区的位置0开始复制。因此,我们总是希望从缓冲区的位置0开始写入输出。 - Yuliy
5个回答

78
使用静态void System.IO.File.WriteAllBytes(string path, byte[] bytes)方法。
byte[] buffer = new byte[200];
File.WriteAllBytes(@"c:\data.dmp", buffer);

3
你忘记转义字符了 ;). 参数应该是 @"c:\data.dmp" 或 "c:\data.dmp"。 - Erich Mirabal
编码怎么办?例如,将文件(ANSI、UTF-8)读入字节数组,然后写入新的文件名。 - Kiquenet
3
哇,为什么不总是这么容易呢?+1 - cbmeeks

5
public static void SaveFile(this Byte[] fileBytes, string fileName)
{
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
    fileStream.Write(fileBytes, 0, fileBytes.Length);
    fileStream.Close();
}

3
除了其他人已经提到的内容,我还建议您使用“using”子句,因为所有这些对象都实现了IDisposable接口。
using(FileStream outFileStream = new ...)
using(ZOutputStream outZStream = new ...)
using(FileStream inFileStream = new ...)
{
    CopyStream(inFileStream, outZStream);
}

1
你可以尝试这段代码。
 private void t1()
    {
        FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open);
        int length = Convert.ToInt16(f1.Length);
        Byte[] b1 = new Byte[length];
        f1.Read(b1, 0, length);
        File.WriteAllBytes("C:\\myfile.txt",b1);
        f1.Dispose();
    }

你忘记释放FileStream了。 - Noldorin
2
Anirudh,习惯使用“using”语句。请参考上面的Erich回答。 - Pure.Krome

1
将接收到的字节数组放入一个MemoryStream中,并在不使用临时文件的情况下实时压缩/解压它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接