BİL527 – Bilgisayar Programlama I File Operations 1 Contents • Structure of a File • Reading/Writing Texts from/to Files • File and Directory Operations 2 Definition of File • A file is a logically contiguous stream of bytes with certain properties – Name – Size (Number of bytes in the file) – Owner (The user who owns the file) – Permission (Who can access the file) – Creation date – Last modification date – etc. 3 File Types • Text Files – In a text file, the byte represent characters making it possible for a human to examine the file or edit it using a text editor • Files which can be opened by Notepad • C# source codes • Binary Files – In a binary file, bytes do not necessarily represent characters. Groups of bytes might represent an int, float, double, etc. • Executable files • Word, Excel, PowerPoint files • Files which can’t be opened by Notepad 4 Text File vs. Binary File • Consider how we can store short int 30000 = 0x7530, which occupies 2 bytes in memory – One option is to store the number in text form as chars ‘3’, ‘0’, ‘0’, ‘0’, ‘0’ • Using ASCII chars, we need 5 bytes to store this number Byte # 0 1 2 3 4 ‘3’ ‘0’ ‘0’ ‘0’ ‘0’ TextFileEx.txt 5 bytes long – The other option is to store the number in binary, which would take as few as 2 bytes Byte # 0 1 0x30 0x75 BinaryFileEx.dat 2 bytes long Assumes little-endian representation 5 Text File vs. Binary File • Why distinguish between text and binary files? – The reason is some operating systems, e.g., Windows stores text files and binary files in different ways – Text files are divided into lines, so there must be some special way o mark the end of each line – Binary files are easy to use by programs and text files are easy to understand for humans 6 File Classes in .NET Framework 7 File Operations • Creating a new file • Appending to an existing file • Reading an existing file 8 Creating a Text File • Create a StreamWriter object by specifying a file path • Use functions Write and WriteLine to write into the file, just like printing on the screen • Close the file 9 Example using System.IO; namespace FileOpDeneme { class Program { static void Main(string[] args) { StreamWriter sw = new StreamWriter("Test.txt"); sw.WriteLine("Roses are red"); sw.WriteLine("Violets are blue"); sw.Close(); } } } 10 Appending to a Text File • When you create a StreamWriter object by new StreamWriter(filename), and file exists, then the file contents are deleted • If you want to append to an existing file, use another constructor of StreamWriter class, which is StreamWriter(string path, bool append) 11 Example using System.IO; namespace FileOpDeneme { class Program { static void Main(string[] args) { StreamWriter sw = new StreamWriter("Test.txt", true); sw.WriteLine("Sugar is sweet"); sw.WriteLine("And so are you"); sw.Close(); } } } 12 Reading an Existing File • Create a StreamReader object by specifying the file path • Use ReadLine() method to read a single line, or ReadToEnd() method to read all contents of the file • Close the file 13 Example using System; using System.IO; namespace FileOpDeneme { class Program { static void Main(string[] args) { StreamReader sr = new StreamReader("Test.txt"); string contents = sr.ReadToEnd(); Console.WriteLine(contents); sr.Close(); } } } 14 using • The files should be closed immediately after finishing work on them • If you forget to close a file, some problems may occur • If you use the file inside a using block, it is automatically closed, i.e. all of its resources are released 15 Example using System; using System.IO; namespace FileOpDeneme { class Program { static void Main(string[] args) { string contents; using (StreamReader sr = new StreamReader("Test.txt")) { contents = sr.ReadToEnd(); } Console.WriteLine(contents); } } } 16 Path Names and Relative Paths • If you don’t specify the path of a file, it is searched in the current directory, i.e. the directory where your executable file is located • You can learn the current directory by the method Directory.GetCurrentDirectory() • You can set the working directory by Directory.SetCurrentDirectory() • You can specify the full path of the file like @“C:\MyPrograms\BIL527\Test.txt” 17 The FileStream Object • With StreamReader and StreamWriter objects, you can work only on characters • If you need to work on bytes, you have to use a FileStream object • On a FileStream object, you can go forward or backward on the file, and read from or write to anywhere on the file 18 Obtaining File and Directory Information • The FileInfo class can be used to obtain information about a specific file FileInfo info = new FileInfo(“Test.txt”); info.Attributes, info.CreationTime, info.LastAccessTime, info.LastWriteTime, info.Length, etc. • If you want to obtain information about a directory, you can use the DirectoryInfo class DirectoryInfo info = new DirectoryInfo(@“c:\”); info.Parent, info.Root, info.GetFiles(), info.GetDirectories(), etc. 19 File System Operations • • • • File.Copy(src, dest): src is copied to dest File.Move(src, dest): src is moved to dest File.Delete(filename): Deletes the file File.Exists(file): Returns true if file exists • Check for other static methods in the File class 20 Directory Operations • • • • • • • • Directory.CreateDirectory() Directory.Delete() Directory.Exists() Directory.Move() Directory.GetCurrentDirectory() Directory.SetCurrentDirectory() Directory.GetLogicalDrives() etc. 21 Monitoring the File System • Your program can be notified when a file or directory is being modified • For this purpose, you can use the FileSystemWatcher class • For more information, you may refer to the textbook, MSDN help, or Google 22 Compressed Files • You can use DeflateStream and GZipStream classes to read and write compressed data from and to files • These classes work with byte data much like FileStream • The classes are located under the System.IO.Compression namespace • For more information, refer to the textbook, MSDN help, or Google 23 Binary Files • You can use BinaryReader and BinaryWriter classes to work on binary files • You can serialize objects so that they can be saved to or read from files – Refer as Serialization • For more information, refer to the textbook, MSDN help, or Google 24