可以将Byte []数组写入C#中的文件吗?


344

我正在尝试将Byte[]代表完整文件的数组写到 文件中。

来自客户端的原始文件通过TCP发送,然后由服务器接收。接收到的流被读取到字节数组,然后发送给该类进行处理。

这主要是为了确保接收TCPClient准备好用于下一个流,并将接收端与处理端分开。

所述FileStream类不采取一个字节数组作为参数或另一个流对象(它允许你写字节到它)。

我的目标是通过与原始线程不同的线程(使用TCPClient的线程)来完成处理。

我不知道该如何实现,该怎么办?

Answers:


728

基于问题的第一句话:“我试图将代表完整文件的Byte []数组写到文件中。”

阻力最小的路径是:

File.WriteAllBytes(string path, byte[] bytes)

记录在这里:

System.IO.File.WriteAllBytes -MSDN


40

您可以使用一个BinaryWriter对象。

protected bool SaveData(string FileName, byte[] Data)
{
    BinaryWriter Writer = null;
    string Name = @"C:\temp\yourfile.name";

    try
    {
        // Create a new stream to write to the file
        Writer = new BinaryWriter(File.OpenWrite(Name));

        // Writer raw data                
        Writer.Write(Data);
        Writer.Flush();
        Writer.Close();
    }
    catch 
    {
        //...
        return false;
    }

    return true;
}

编辑:糟糕,忘记了这一finally部分...可以说它是作为练习留给读者的;-)


可以说,我收到了压缩数据,并将其解压缩为Byte []。是否可以使用上述功能重新创建文件?在线上有任何教程或演示吗?
加农炮

@buffer_overflow:如果要恢复原始文件,则需要先对其进行压缩。看一下装饰器模式以实现可能的实现:en.wikipedia.org/wiki/Decorator_pattern
Treb

2
BinaryWriter是一次性的,因此应该在一个using块内使用。这也意味着您可能会省去一些额外的调用,因为源代码表明它在处置时进行了一些清理。
杰夫·B


11

您可以通过使用System.IO.BinaryWriterStream 来做到这一点,以便:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);

7
只想添加,在写完后添加bw.flush和bw.close
dekdev

6
@dekdev:在调用Flush()之前没有意义,Close()因为Close()它将刷新。更好的是使用using也会冲洗'n'close 的子句。
托马斯2015年

1
不要忘记使用Dispose。
vitor_gaudencio_oliveira



1

尝试BinaryReader:

/// <summary>
/// Convert the Binary AnyFile to Byte[] format
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ConvertANYFileToBytes(HttpPostedFileBase image)
{
    byte[] imageBytes = null;
    BinaryReader reader = new BinaryReader(image.InputStream);
    imageBytes = reader.ReadBytes((int)image.ContentLength);
    return imageBytes;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.