/*
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
*/