Mega Code Archive

 
Categories / C# / File Stream
 

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