Question

I am trying to send a FileStream of a file.

But I now want to add 40 byte Checksum to the start.

How can I do this? Ive tried creating my own stream class to concatinate two streams.. And Ive looked at stream writers.

Surely they must be an easy way. Or an alternative way. And I DONT want to load the entire file into a byte array, appead to that and write that back to a stream.

public Stream getFile(String basePath, String path) {
    return new FileStream(basePath + path, FileMode.Open, FileAccess.Read);
 }
Was it helpful?

Solution

See MergeStream.cs. Here's how you can use it:

var mergeStream = new MergeStream(new MemoryStream(checksum), File.OpenRead(path));
return mergeStream;

OTHER TIPS

byte[] checksum = new byte[40];
//...
FileStream oldFileStream = new FileStream(oldFile, FileMode.Open, FileAccess.Read);
FileStream newFileStream = new FileStream(newFile, FileMode.Create, FileAccess.Write);

using(oldFileStream)
using(newFileStream)
{
    newFileStream.Write(checksum, 0, checksum.Length);
    oldFileStream.CopyTo(newFileStream);
}
File.Copy(newFile, oldFile, overwrite : true);

If you don't want to use a temporary file, the only solution is to open the file in ReadWrite mode and use two alternating buffers:

private static void Swap<T>(ref T obj1, ref T obj2) 
{
    T tmp = obj1;
    obj1 = obj2;
    obj2 = tmp;
}

public static void PrependToFile(string filename, byte[] bytes)
{
    FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
    PrependToStream(stream, bytes);
}
public static void PrependToStream(Stream stream, byte[] bytes) 
{
    const int MAX_BUFFER_SIZE = 4096;
    using(stream)
    {
        int bufferSize = Math.Max(MAX_BUFFER_SIZE, bytes.Length);
        byte[] buffer1 = new byte[bufferSize];
        byte[] buffer2 = new byte[bufferSize];
        int readCount1; 
        int readCount2;

        long totalLength = stream.Length + bytes.Length;

        readCount1 = stream.Read(buffer1, 0, bytes.Length);
        stream.Position = 0;
        stream.Write(bytes, 0, bytes.Length);
        int written = bytes.Length;

        while (written < totalLength)
        {
            readCount2 = stream.Read(buffer2, 0, buffer2.Length);
            stream.Position -= readCount2;
            stream.Write(buffer1, 0, readCount1);

            written += readCount1;

            Swap(ref buffer1, ref buffer2);
            Swap(ref readCount1, ref readCount2);
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top