11_C#_IO

advertisement
Пространство имен 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). Возвращаемая
строка не содержит эти символы.
Download