Can a Byte[] Array be written to a file in C#?
Asked Answered
M

9

415

I'm trying to write out a Byte[] array representing a complete file to a file.

The original file from the client is sent via TCP and then received by a server. The received stream is read to a byte array and then sent to be processed by this class.

This is mainly to ensure that the receiving TCPClient is ready for the next stream and separate the receiving end from the processing end.

The FileStream class does not take a byte array as an argument or another Stream object ( which does allow you to write bytes to it).

I'm aiming to get the processing done by a different thread from the original ( the one with the TCPClient).

I don't know how to implement this, what should I try?

Moorefield answered 19/12, 2008 at 16:51 Comment(0)
R
841

Based on the first sentence of the question: "I'm trying to write out a Byte[] array representing a complete file to a file."

The path of least resistance would be:

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

Documented here:

System.IO.File.WriteAllBytes - MSDN

Replication answered 19/12, 2008 at 16:58 Comment(0)
B
46

You can use a BinaryWriter object.

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;
}

Edit: Oops, forgot the finally part... lets say it is left as an exercise for the reader ;-)

Bohemia answered 19/12, 2008 at 16:58 Comment(4)
Lets say, I have received compressed data, and I have decompressed it to Byte[]. Is it possible to create the file back using above function ? Any tutorial or demo online ?Antipasto
@buffer_overflow: You would need to compress it first if you want to get the original file back. Have a look at the Decorator Pattern for a possible implementation: en.wikipedia.org/wiki/Decorator_patternBohemia
BinaryWriter is disposable so should probably be used within an using block. That'd also mean you could probably leave off some of the extra calls since the source code shows that it does some cleanup while disposing.Superordinate
Why swallow the exception and return true/false? Daft.Deck
G
24

There is a static method System.IO.File.WriteAllBytes

Graben answered 19/12, 2008 at 16:59 Comment(0)
C
13

You can do this using System.IO.BinaryWriter which takes a Stream so:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);
Continuant answered 19/12, 2008 at 16:58 Comment(3)
Just want to add , after write add bw.flush and bw.closeGiffer
@dekdev: There is no point in calling Flush() before Close() as Close() will flush. Even better is to use a using clause which will also flush'n'close.Lakes
Do not forget to use the Dispose;Wirewove
S
9

You can use the FileStream.Write(byte[] array, int offset, int count) method to write it out.

If your array name is "myArray" the code would be.

myStream.Write(myArray, 0, myArray.count);
Shainashaine answered 19/12, 2008 at 17:0 Comment(0)
D
6

Yep, why not?

fs.Write(myByteArray, 0, myByteArray.Length);
Disconcerted answered 19/12, 2008 at 16:57 Comment(0)
H
3

For completeness, there is also an async version of the File.WriteAllBytes() method:

Task WriteAllBytesAsync(
    string path,
    byte[] bytes,
    CancellationToken cancellationToken = default)

Docs here: System.IO.File.WriteAllBytesAsync()

Example usage (in an async method):

await File.WriteAllBytesAsync("C:\\Test.png", bytes);

Note that since writing to a file is an IO operation, as a general rule it must be performed asynchronously not to block the UI.

Heave answered 27/7, 2023 at 13:11 Comment(0)
U
2

Try 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;
}
Underwrite answered 25/2, 2018 at 21:36 Comment(0)
B
1

Asp.net (c#)

// This is server path, where application is hosted.

var path = @"C:\Websites\mywebsite\profiles\";

//file in bytes array

var imageBytes = client.DownloadData(imagePath);

//file extension

var fileExtension = System.IO.Path.GetExtension(imagePath);

//writing(saving) the files on given path. Appending employee id as file name and file extension.

File.WriteAllBytes(path + dataTable.Rows[0]["empid"].ToString() + fileExtension, imageBytes);

Next Step:

You may need to Provide access to profile folder for iis user.

  1. right click on profile folder
  2. go to security tab
  3. click "Edit",
  4. give full control to "IIS_IUSRS" (IF THIS USER NOT EXISTS THEN CLICK ON ADD AND TYPE "IIS_IUSRS" AND CLICK ON "Check Names".
Brownnose answered 17/9, 2020 at 13:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.