Search code examples
c#oracle-databaseblobfilestream

C# BinaryWriter, Write with 8 bit


Im Using Binarywriter to save blob data (PDF) from oracle to disk. The result is ugly when i open the generated file. I think its the problem of that 1 character is write with one byte.

How can i increase to write to 8. (/BitsPerComponent 8)

Any Ideas ?

long CurrentIndex = 0;
int BufferSize = 10000;
long BytesReturned;
byte[] Blob = new byte[BufferSize];

OracleDataReader reader = comando.ExecuteReader(CommandBehavior.SequentialAccess);
string filepath = "C:\\ttttt.pdf";
while (reader.Read())
{
    FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);
    BinaryWriter writer = new BinaryWriter(fs);
    //reset the index to the beginning of the file
    CurrentIndex = 0;
    BytesReturned = reader.GetBytes(0, CurrentIndex, Blob, 0, BufferSize);
    while (BytesReturned == BufferSize)
    {
        writer.Write(Blob);
        writer.Flush();
        CurrentIndex += BufferSize;
        BytesReturned = reader.GetBytes(0, CurrentIndex, Blob, 0, BufferSize);
    }

    writer.Write(Blob, 0, (int)BytesReturned);
    writer.Flush();
    writer.Close();
    fs.Close();
}

Solution

  • You don't need a BinaryWriter for this. Just write to the stream directly. BinaryWriter's intended use case is writing primitive data types to a stream for serialization purposes.

    Update: Automatically generate a filename from Base64(MD5(Blob)).

    long CurrentIndex = 0;
    int BufferSize = 10000;
    long BytesReturned;
    byte[] Blob = new byte[BufferSize];
    
    using (var hasher = MD5.Create())
    {
        using (var reader = comando.ExecuteReader(CommandBehavior.SequentialAccess))
        {
            while (reader.Read())
            {
                var filename = Convert.ToBase64String(hasher.ComputeHash(Blob)).Replace("=", string.Empty);
                var filepath = Path.ChangeExtension(Path.Combine("C:\\", filename), ".pdf");
                    
                using (var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    //reset the index to the beginning of the file
                    CurrentIndex = 0;
                    BytesReturned = reader.GetBytes(0, CurrentIndex, Blob, 0, BufferSize);
                    while (BytesReturned == BufferSize)
                    {
                        fs.Write(Blob, 0, Blob.Length);
                        CurrentIndex += BufferSize;
                        BytesReturned = reader.GetBytes(0, CurrentIndex, Blob, 0, BufferSize);
                    }
    
                    fs.Write(Blob, 0, (int)BytesReturned);
                }
            }
        }
    }