Reading a file into memory using C#

Reading a file into memory, attaching it to a memorystream and using stream methods to access the contents.

 
/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
 
 
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
// MemStrm.cs -- Demonstrates reading a file into memory, attaching it to a
//               MemoryStream and using stream methods to access the contents
//
//               Compile this program with the following command line:
//   C:>csc MemStrm.cs
using System;
using System.IO;
 
 
namespace nsStreams
{
    public class MemStrm
    {
        const string USA = "[USA]";
        const string PhoneEntry = "Phone_number=";
        static public void Main ()
        {
            FileStream cfg;
            try
            {
cfg = new FileStream ("./config.ini",
      FileMode.Open,
      FileAccess.ReadWrite);
            }
            catch (FileNotFoundException)
            {
Console.WriteLine ("Cannot find ./config.ini");
return;
            }
            catch (Exception e)
            {
Console.WriteLine (e.Message);
Console.WriteLine ("Cannot find ./config.ini");
return;
            }
            MemoryStream mem = new MemoryStream ((int) cfg.Length);
            cfg.Read (mem.GetBuffer(), 0, (int) cfg.Length);
            int pos = FindInBuffer (USA, 0, mem.GetBuffer());
            if (pos < 0)
            {
Console.WriteLine ("Could not find match in buffer");
            }
            else
            {
pos = FindInBuffer (PhoneEntry, pos, mem.GetBuffer());
if (pos < 0)
{
    Console.WriteLine ("Could not find phone number");
}
else
{
    const string NewPhone = "1888555-9876";
    mem.Seek (pos + PhoneEntry.Length, SeekOrigin.Begin);
    for (int x = 0; x < NewPhone.Length; ++x)
    {
          mem.WriteByte ((byte) NewPhone[x]);
    }
    cfg.SetLength (0);
    cfg.Write (mem.GetBuffer(), 0,
              (int) mem.GetBuffer().Length);
}
            }
            cfg.Flush ();
            cfg.Close ();
            mem.Close ();
        }
//
// Find a string of characters in a buffer of type byte
        static int FindInBuffer (string ToFind, int start, byte [] buf)
        {
            for (int x = start; x < buf.Length; ++x)
            {
if (buf[x] == (byte) ToFind[0])
{
    int y;
    for (y = 1; y < ToFind.Length; ++y)
    {
        if ((x + y) >= buf.Length)
            break;
        if (buf[x + y] != (byte) ToFind[y])
            break;
    }
    if (y == ToFind.Length)
    {
        return (x);
    }
}
            }
            return (-1);
        }
//
// Convert a buffer of type string to byte
        static void StringToByte (out byte [] b, string str)
        {
            b = new byte [str.Length];
            for (int x = 0; x < str.Length; ++x)
            {
b[x] = (byte) str [x];
            }
        }
//
// Convert a buffer of type byte to a string
        static string ByteToString (byte [] b, int start)
        {
            string str = "";
            for (int x = start; x < b.Length; ++x)
            {
str += (char) b [x];
            }
            return (str);
        }
    }
}
 
 
//File: config.ini
/*
[PROGRAM]
Program Directory=C:\TEMP\
Data Directory=
 
 
[DEFAULTS]
Phone_number=800-555-2345
Wallpaper=wallppr.bmp
sshow=default
 
 
[Modem]
Initialization String=ATX4L1
Dial Type=1
 
 
[Countries]
1=USA
2=Canada
3=United Kingdom
 
 
[USA]
Phone_number=1800555-1234
TOLLFREE=1
 
 
[Canada]
Phone_number=1800555-2345
TOLLFREE=1
 
 
[United Kingdom]
Phone_number=08009872345
TOLLFREE=1
 
 
*/

Share Article/Example:
  • DotNetKicks
  • DZone
  • StumbleUpon
  • Print
  • Add to favorites
  • Digg
  • del.icio.us
  • Twitter
  • Facebook
  • LinkedIn
  • Posterous
  • Slashdot

Filed Under: C# Streams Examples

RSSComments (0)

Trackback URL

Leave a Reply




If you want a picture to show with your comment, go get a Gravatar.