Graphical User Interfaces

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