Пространство имен System.IO В пространстве имен System.IO находятся классы для работы с файловой системой. Три группы классов: • Классы для работы с файлами и каталогами (создание, переименование, удаление и т.д.) • Потоковые классы описывают источник/приемник данных. • Классы читатели/писатели (readers/writers) описывают способы записи/чтения. Классы для работы с файлами и каталогами System.Object System.IO.File System.IO.Directory System.IO.FileSystemInfo System.IO.DirectoryInfo System.IO.FileInfo File Directory только статические методы для работы с файлами и каталогами Абстрактный базовый класс FileSystemInfo общие экземплярные методы для работы с файлами и каталогами, например, свойство public DateTime LastAccessTime {get; set;} FileInfo DirectoryInfo только экземплярные методы для работы с файлами и каталогами Статические методы классов File и Directoty при каждом вызове выполняют проверку прав доступа (security check). Более эффективны при однократной операции с файлом или каталогом. Экземплярные методы классов FileInfo и DirectoryInfo больше подходят для многократных операций с файлом или каталогом. Классы для работы с каталогами. Пример Console.WriteLine(Directory.GetCurrentDirectory()); try { Directory.SetCurrentDirectory("..\\..\\"); Console.WriteLine(Directory.GetCurrentDirectory()); Directory.SetCurrentDirectory(“bin\\Debug"); Console.WriteLine(Directory.GetCurrentDirectory()); Directory.SetCurrentDirectory("\\"); Console.WriteLine(Directory.GetCurrentDirectory()); } catch (Exception ex) { Console.WriteLine(ex.Message); Вывод: C:\C#_2008\Samples\IO_Demo\IO_Demo\bin\Release C:\C#_2008\Samples\IO_Demo\IO_Demo C:\C#_2008\Samples\IO_Demo\IO_Demo\bin\Debug C:\ } Некоторые методы классов File и FileInfo Класс File: public static FileStream Create( string path ); public static FileStream Open( string path, FileMode mode ); public static FileStream Open( string path, FileMode mode, FileAccess access ); public static FileStream Open( string path, FileMode mode, FileAccess access, FileShare share ); public static FileStream OpenRead( string path ); public static FileStream OpenWrite( string path ); Класс FileInfo: public FileInfo( string fileName ); // конструктор public FileStream Create(); public FileStream Open( FileMode mode ); public FileStream Open( FileMode mode, FileAccess access ); public FileStream Open( FileMode mode, FileAccess access, FileShare share ); public FileStream OpenRead(); public FileStream OpenWrite(); Некоторые методы классов File и FileInfo - 2 Create() • файл создается, если не существует; • файл перезаписывается, если существует и не имеет атрибут read-only; • бросается исключение, если существует и имеет атрибут read-only; • все пользователи имеют права записи/чтения; OpenRead() cоздает поток только для чтения; OpenWrite() cоздает поток только для записи; Перечисление FileMode Append • открывает, если существует; • создает, если не существует; • текущая позиция в конце файла; • только с FileAccess.Write; Create • создает, если не существует; • перезаписывает, если существует; CreateNew • создает, если не существует; • бросает исключение, если существует; Open • открывает, если существует; • бросает исключение, если не существует; OpenOrCreate • открывает, если существует; • создает, если не существует; Trancate • открывает, если существует; • устанавливает длину 0; • бросает исключение, если не существует; public enum FileAccess { Read , ReadWrite, Write }; Классы для работы с потоками System.IO.Stream System.IO.BufferedStream System.IO.FileStream System.IO.MemoryStream System.Net.Sockets.NetworkStream System.Security.Cryptography.CryptoStream abstract class Stream • поддерживает чтение/запись байт; • по умолчанию выполняет синхронные операции чтения/ записи; • есть асинхронные операции; FileStream поток файловой системы; имеет внутренний буфер – блок памяти для кэширования данных для уменьшения обращений к OC; MemoryStream поток, связанный с областью памяти; BufferedStream добавляет буферизацию к другим потокам; NetworkStream поток, связанный с socket; CryptoStream поток с шифрованием данных; Класс FileStream Класс имеет 9 конструкторов public FileStream( string path, FileMode mode ); public FileStream( string path, FileMode mode, FileAccess access ); public FileStream( string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, bool useAsync ); Потоковые классы поддерживают только самые простые операции чтения/записи: Чтение/запись одного байта: public override int ReadByte(); public override void WriteByte( byte value ); Чтение/запись блока байт: public override void Write ( byte[] array, int offset, int count ); public override int Read ( byte[] array, int offset, int count ); Классы читатели/писатели System.Object System.IO.BinaryReader System.IO.BinaryWriter BinaryReader BinaryWriter используются для чтения и записи в файл значений простых типов как последовательности байт; System.IO.TextReader System.IO.StreamReader System.IO.StringReader System.IO.TextWriter System.IO.StreamWriter System.IO.StringWriter TextReader TextWriter (абстрактные) работают с символами Unicode; StreamReader StreamWriter используются для чтения и записи информации в текстовом виде; StringReader StringWriter реализация TextReader и TextWriter для строк; Классы BinaryReader и BinaryWriter Классы BinaryReader и BinaryWriter применяются для чтения и записи в файл значений простых типов как последовательности байт. В BinaryReader и BinaryWriter определены конструкторы (2): public BinaryReader( Stream input ); public BinaryReader( Stream input, Encoding encoding ); public BinaryWriter( Stream output ); public BinaryWriter( Stream output, Encoding encoding ); Для параметра Encoding по умолчанию используется System.Text.UTF8Encoding System.Text.Encoding System.Text.ASCIIEncoding System.Text.UnicodeEncoding System.Text.UTF7Encoding System.Text.UTF8Encoding Классы BinaryReader и BinaryWriter -2 В классе BinaryWriter перегружен метод Write для всех примитивных типов и для массивов byte и char: public public public public public public public virtual virtual virtual virtual virtual virtual virtual void void void void void void void Write( Write( Write( Write( Write( Write( Write( bool value ); int value ); double value ); string value ); byte[] buffer ); byte[] buffer, int index, int count ); char[] chars ); B классе BinaryReader для каждого встроенного типа определен метод со своим именем : ReadBoolean, ReadInt32, … public public public public public public virtual virtual virtual virtual virtual virtual bool ReadBoolean(); int ReadInt32(); double ReadDouble(); string ReadString(); byte[] ReadBytes( int count ); char[] ReadChars( int count ); Классы BinaryReader и BinaryWriter. Пример В методах Write(string fileName) и Read(string fileName) класса Student записываются в файл и читаются из файла данные объекта. public void Read(string fileName) public void Write(string fileName) { FileStream fs = new FileStream( fileName, { try { FileStream fs = new FileStream( fileName, FileMode.OpenOrCreate | FileMode.Append, FileMode.Open, FileAccess.Read); FileAccess.Write); BinaryReader br = new BinaryReader(fs); BinaryWriter bw = new BinaryWriter(fs); ball = br.ReadDouble(); bw.Write(ball); group = br.ReadInt32(); bw.Write(group); names[0] = br.ReadString(); bw.Write(names[0]); names[1] = br.ReadString(); bw.Write(names[1]); int year = br.ReadInt32(); // bw.Write(date); int month = br.ReadInt32(); bw.Write(date.Year); int day = br.ReadInt32(); bw.Write(date.Month); bw.Write(date.Day); fs.Close(); } // надо закрыть поток! date = new DateTime(year, month, day); } catch( Exception ex) { Console.WriteLine(ex.Message); } finally { if (fs!=null) fs.Close(); } } Классы TextWriter, StreamWriter и StringWriter System.IO.TextWriter System.IO.StreamWriter System.IO.StringWriter Класс TextWriter - абстрактный. В классе StreamWriter определены конструкторы (7 перегрузок): public StreamWriter( Stream stream ) ; public StreamWriter( string path ); public StreamWriter( Stream stream, Encoding encoding ); Конструкторы класса StringWriter (4) public StringWriter(); public StringWriter( StringBuilder sb ); Классы TextWriter, StreamWriter и StringWriter -2 Методы для записи текстовой информации в классах StreamWriter и StringWriter переопределяют виртуальные методы из класса TextWriter. Методы Write() и WriteLine() записывают в поток значение в текстовом виде. Методы WriteLine() добавляют конец строки. Методы Write() и WriteLine() перегружены для всех встроенных типов. public virtual void Write( bool value ); public virtual void Write( double value ): public virtual void Write( int value ) ; Методы Write() и WriteLine() c параметрами типа object для преобразования значений в текстовый вид используют метод ToString() или строку формата. public void Write( Object value ) ; public virtual void Write( string format, Object arg0 ) ; public virtual void Write( string format, Object[] arg ); Символы конца строки в методах WriteLine() Методы WriteLine() добавляют в поток символы конца строки. По умолчанию используется комбинация символов “\r\n” . Свойство NewLine класса TextWriter дает возможность выбрать другую последовательность символов, которые будут обозначать конец строки. public virtual string NewLine { get; set; } В методах ReadLine() cтрокой (line) считается последовательность символов, которая завершается символом новой строки ‘\n” или символом возврата каретки ‘ \r ‘ или подряд идущими символами “\r\n”. Классы TextReader, StreamReader и StringReader System.IO.TextReader System.IO.StreamReader System.IO.StringReader Класс TextReader - абстрактный. В классе StreamReader определены конструкторы (10 перегрузок): public StreamReader( Stream stream ) ; public StreamReader( string path ); public StreamReader( Stream stream, Encoding encoding ); Единственный конструктор класса StringReader public StringReader( string s ); Классы TextReader, StreamReader и StringReader -2 Методы для чтения текстовой информации в классах StreamReader и StringReader переопределяют виртуальные методы из класса TextReader. public public public public public virtual virtual virtual virtual virtual int Read(); int Read( char[] buffer, int index, int count ); int ReadBlock( char[] buffer, int index, int count ); string ReadLine(): string ReadToEnd(); Метод Read() читает из потока один символ. Методы Read() и ReadBlock() читают не более count символов и сохраняют их в массиве buffer, начиная с индекса index. В методах ReadLine() cтрокой (line) считается последовательность символов, которая завершается символом новой строки( \n ) или символом возврата каретки ( \r ) или подряд идущими символами( \r\n). Возвращаемая строка не содержит эти символы.