You are on page 1of 4

Working with Streams

No, I haven't turned this into an article about the great outdoors. Streams have their place with computers as well, although I wouldn't recommend getting your computer near one of the traditional kind. Streams are a concept that have been around for a while, but that are new to Microsoft developers via .NET. A stream is a base class used to abstract the specifics of input and output from the underlying device(s). In general, streams support the ability to read or write. Some streams provide additional capabilities such as seek, which allows navigation forward to a specific location. The device could be a physical file, memory, or the network. List of classes that inherit from the Stream base class are as follows: FileStreamread, write, open, and close files MemoryStreamread and write managed memory NetworkStreamread and write between network connections (System.Net namespace) CryptoStreamread and write data through cryptographic transformations BufferedStreamadds buffering to another stream that does not inherently support buffering While the streams are used to abstract the input and output from the device, the stream itself is not directly used to read and write data. Instead, a reader or writer object is used to interact with the stream and perform the physical read and write. Here is a list of classes used for reading and writing to streams: BinaryReader and BinaryWriterread and write binary data to streams StreamReader and StreamWriterread and write characters from streams StringReader and StringWriterread and write characters from Strings TextReader and TextWriterread and write Unicode text from streams

Reading and Writing Text


The following section will use StreamWriter, StreamReader, and FileStream to write text to a file and then read and display the entire contents of the file.

Sample Code to Write and Read a File


using System; using System.IO; namespace CodeGuru.FileOperations { /// <remarks> /// Sample to demonstrate writing and reading a file. /// </remarks> class WriteReadFile { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { FileStream fileStream = null; StreamReader reader = null;

StreamWriter writer = null; try { // Create or open the file fileStream = new FileStream("c:\\mylog.txt", FileMode.OpenOrCreate, FileAccess.Write); writer = new StreamWriter(fileStream); // Set the file pointer to the end of the file writer.BaseStream.Seek(0, SeekOrigin.End); // Force the write to the underlying file and close writer.WriteLine( System.DateTime.Now.ToString() + " - Hello World!"); writer.Flush(); writer.Close(); // Read and display the contents of the file one // line at a time. String fileLine; reader = new StreamReader("c:\\mylog.txt"); while( (fileLine = reader.ReadLine()) != null ) { Console.WriteLine(fileLine); } } finally { // Make sure we cleanup after ourselves if( writer != null ) writer.Close(); if( reader != null ) reader.Close(); } } } }

Working with Directories


There two classes for the manipulation of directories. The classes are named Directory and the DirectoryInfo. The Directory class provides static methods for directory manipulation. The DirectoryInfo class provides instance methods for directory manipulation. They provide the same features and functionality, so the choice comes down to whether you need an instance of an object or not. The members include, but are not limited to the following: Createcreate a directory Deletedelete a directory GetDirectoriesreturn subdirectories of the current directory MoveTomove a directory to a new location

Sample Code to Produce a List of All Directories


The following sample code demonstrates the ability to produce a list of directories using recursion. A recursive procedure is one that calls itself. You must ensure that your procedure does not call itself indefinitely; otherwise, you'll eventually run out of memory. In this case, there are a finite number of subdirectories, so there is automatically a termination point. using System; using System.IO; namespace CodeGuru.FileOperations { /// <remarks> /// Sample to demonstrate reading the contents of directories. /// </remarks> class ReadDirectory { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { DirectoryInfo dirInfo = new DirectoryInfo("c:\\"); Console.WriteLine("Root: {0}", dirInfo.Name); ReadDirectory.ProduceListing(dirInfo, " "); Console.ReadLine(); } /* * Recursively produce a list of files */ private static void ProduceListing(DirectoryInfo dirInfo, string Spacer) { Console.WriteLine(Spacer + "{0}", dirInfo.Name);

foreach(DirectoryInfo subDir in dirInfo.GetDirectories()) { Console.WriteLine(Spacer + Spacer + "{0}", subDir.Name); if( subDir.GetDirectories().Length > 0 ) { ProduceListing(subDir, Spacer + " "); } } } } }

You might also like