CSCI 3328 Object Oriented Programming in C# Chapter 11: Files and Streams Xiang Lian The University of Texas – Pan American Edinburg, TX 78539 [email protected] 1 Objectives • In this chapter, you will – Learn how to create, read, write, and update files – Know how to use classes File and Directory to obtain information about files and directories on your computer – Learn how to use LINQ to search through directories – Get familiar with sequential-access file processing – Know how to use classes FileStream, StreamReader, StreamWriter, FileStream, and BinaryFormatter, as well as yield return 2 Introduction • Variables and arrays only offer temporary storage of data – Data are lost when the program terminates • In contrast, files are used for long-term storage place – Persistent data – Data are stored on secondary storage devices 3 Data Hierarchy • • • • • Bits Characters (ASCII or Unicode) Fields Records Files – Record key – Sequential file • Databases 4 Files and Streams • File as a sequential stream of bytes • Each file ends with an end-of-file marker • Windows keeps track of total number of bytes in a file • When a file is opened an object is created and a stream is associated with the object • Each program automatically gets 3 objects, Console.Out, Console.In and Console.Error 5 Classes File and Directory • Files are organized in directories • Class Directory provides capabilities for manipulating directories • Class File has static methods: – AppendText, Copy, Create, CreateText, Delete, Exists, GetCreationTime, GetLastAccessTime, GetLastWriteTime, Move, Open, OpenRead, OpenText, OpenWrite 6 Directory Class Static Methods • • • • • • • • • CreateDirectory Delete Exists GetDirectories GetFiles GetCreationTime GetLastAccessTime GetLastWriteTime Move 7 Create a File to Read/Write • Pre-defined class library – using System.IO; • StreamWriter (for text output) – StreamWriter outFile = new StreamWriter(fileName); • StreamReader (for text input) – StreamReader inFile = null; try{ using (inFile = new StreamReader(fileName)) { outputTextBox.AppendText(inFile.ReadToEnd());} } catch(IOException) { MessageBox.Show("Error reading from file", "File Error", MessageBoxButton.OK, MessageBoxIcon.Error); } 8 Write to the File • string fileName="test.txt"; • File.Exists(fileName) – true, if fileName exists • outFile.WriteLine("text"); • Other methods – File.GetCreationTime(fileName); – File.GetLastWriteTime(fileName); – File.GetLastAccessTime(fileName); 9 Read From the File • inFile.ReadLine("text"); 10 Close the File • outFile.Close(); • inFile.Close(); 11 Directory • Directory.Exists(Name); – true, if directory Name exists • string [] directoryList = Directory.GetDirectories(Name); – Obtain a list of files and directories 12 Searching Directories with LINQ • • • • • string currentDirectory; currentDirectory = Directory.GetCurrentDirectory(); string [] files = Directory.GetFiles(currentDirectory); string [] directories=Directory.GetDirectories(currentDirectory); var extensions = (from file in files select Path.GetExtension(file)).Distinct(); foreach(var extension in extensions) { var extensionCount = (from file in files where Path.GetExtension(file)==extension select file).Count(); } 13 Dictionary Class • A class Dictionary is a collection of key/value pairs – In namespace System.Collections.Generic – Dictionary <string, int> found = new Dictionary <string, int>(); • Key is of string data type, and value is of int data type • Methods – found.ContainsKey(extension) • true, if the directory contains a key for the extension – found.Add(extension, extensionCount); – found[extension] • Returns the value of the key "extension" – found.Keys • A collection of keys 14 Example of Deleting Files var backupFiles = from file in files where Path.GetExtension(file)==".bak" select file; foreach (var backup in backupFiles) { DialogResult result = MessageBox.Show("Found backup file " + Path.GetFileName(backup) + ". Delete?", "Delete Backup", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { File.Delete(backup); found[".bak"]--; if (found[".bak"] == 0) found.Remove(".bak"); } // delete the file with name in "backup" // decrement the counter // remove the key from dictionary } 15 Create a Sequential File • In C# files, the concept of a "record" does not exist • Therefore, you have to create structured files by yourself – Use text and special characters to separate fields in the record 16 Example of Creating a Sequential File public class Record { public int Account {get; set;} public string FirstName {get; set;} public string LastName {get; set;} public decimal Balance {get; set;} public Record() :this(0, string.Empty, string.Empty, 0M){} public RecordSerializable (int acc, string fName, string lName, decimal bal) { Account = acc; FirstName = fName; LastName = lName; Balance = bal; } } 17 Example of Creating a Sequential File (cont'd) • FileStream output = new FileStream (fileName, FileMode.OpenOrCreate, FileAccess.Write); • StreamWriter fileWriter = new StreamWriter(output); • Record record = new Record(); • fileWriter.WriteLine(record.Account + "," + record.FirstName + "," + record.LastName + "," + record.Balance); 18 Reading Data From a SequentialAccess Text File • FileStream input = new FileStream(fileName, FileMode.Open, FileAccess.Read); • StreamReader fileReader = new StreamReader(input); • string inputRecord = fileReader.ReadLine(); • string[] inputFields; • if (inputRecord != null) { inputFields = inputRecord.Split(','); Record record = new Record(Convert.ToInt32(inputFields[0]), inputFields[1], inputFields[2], Convert.ToDecimal(inputFields[3])); } 19 Class BinaryFormatter • Class BinaryFormatter – Under namespace System.Runtime.Serialization.Formatters.Binary – Serializable(outFile, object) method • Write a serializable object to the output file • Serialization – In a class that is marked with [Serializable] attribute or that implements interface Iserializable, you must ensure that every instance variable in a class is also serializable – All simple-type variables, strings, and arrays (without containing references) are serializable 20 Example of RecordSerializable Class public class RecordSerializable { [Serializable] public int Account {get; set;} public string FirstName {get; set;} public string LastName {get; set;} public decimal Balance {get; set;} public RecordSerializable() :this(0, string.Empty, string.Empty, 0M){} public RecordSerializable (int acc, string fName, string lName, decimal bal) { Account = acc; FirstName = fName; LastName = lName; Balance = bal; } } 21 Example of RecordSerializable Class (cont'd) BinaryFormatter formatter = new BinaryFormatter(); FileStream output = new FileStream(fileName, FileAccess.Write); FileMode.OpenOrCreate, try{ RecordSerializable record = new RecordSerializable(); formatter.Serialize(output, record); } catch (SerializationException) { // … } catch (FormatException) { // … } 22 Reading and Deserializing Data From a Binary File BinaryFormatter reader = new BinaryFormatter(); FileStream input = new FileStream(fileName, FileMode.Open, FileAccess.Read); try{ RecordSerializable record = (RecordSerializable) reader.Deserialize(input); } catch (SerializationException) { input.Close(); } 23 Select Files from Chooser • Recall this topic in lecture slides of Chapter 8 24 Obtaining File Name From Chooser OpenFileDialog fDialog = new OpenFileDialog(); if (fDialog.ShowDialog() == DialogResult.OK) { fileName = (fDialog.FileName.ToString()); MessageBox.Show(fileName); } 25 Reading From a File StreamReader ofile = new StreamReader(fileName); while (ofile.Peek()!=-1) { string oneline = ofile.ReadLine(); MessageBox.Show(oneline,"Reading From File.."); string[] items = oneline.Split(','); onePerson.fName = items[0]; onePerson.lName = items[1]; onePerson.GPA = Convert.ToSingle(items[3]); onePerson.Tele = items[2]; friendsList.Add(onePerson); } ofile.Close(); 26 Writing to the File StreamWriter outfile = new StreamWriter(fileName); foreach (Info person in friendsList) outfile.WriteLine(person.fName+","+person.lName+" ,"+person.Tele+","+Convert.ToString(person.GPA)); outfile.Close(); 27 28
© Copyright 2026 Paperzz