Home > database >  C# BinaryWriter, Write with 8 bit
C# BinaryWriter, Write with 8 bit

Time:10-25

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

CodePudding user response:

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);
            }
        }
    }
}
  • Related