Вывод содержимого файла на C#
DirectoryInfo
FileInfo
FileInfo
FileInfo
FileInfo
433.57K
Category: programmingprogramming

LK04_2

1.

Работа с файлами
1

2.

Общие принципы работы с файлами
➢Чтение (ввод) — передача данных с внешнего устройства в оперативную
память, обратный процесс — запись (вывод).
➢Ввод-вывод в C# выполняется с помощью подсистемы ввода-вывода и
классов библиотеки .NET. Обмен данными реализуется с помощью потоков.
➢Поток (stream) — абстрактное понятие, относящееся к любому переносу
данных от источника к приемнику. Потоки обеспечивают надежную работу
как со стандартными, так и с определенными пользователем типами
данных, а также единообразный и понятный синтаксис.
➢Поток определяется как последовательность байтов и не зависит от
конкретного устройства, с которым производится обмен.
➢Обмен с потоком для повышения скорости передачи данных
производится, как правило, через буфер. Буфер выделяется для каждого
открытого файла.
2

3.

Классы .NET для работы с потоками
object
DirectoryInfo
MarshalBy Ref Object
BinaryReader
FileSystemInfo
FileInfo
Stream
BufferedStream
BinaryWriter
FileStream
MemoryStream
Directory
File
TextReader
StreamReader
StringReader
TextWriter
StreamWriter
StringWriter
3

4.

Уровни обмена с внешними устройствами
Выполнять обмен с внешними устройствами можно на уровне:
➢двоичного представления данных
(BinaryReader, BinaryWriter);
➢байтов
(FileStream);
➢текста, то есть символов
(StreamWriter, StreamReader).
4

5.

Доступ к файлам
Доступ к файлам может быть:
последовательным - очередной элемент можно прочитать
(записать) только после аналогичной операции с предыдущим
элементом
произвольным, или прямым, при котором выполняется чтение
(запись) произвольного элемента по заданному адресу.
Текстовые файлы - только последовательный доступ
В двоичных и байтовых потоках можно использовать оба метода доступа
Прямой доступ в сочетании с отсутствием преобразований обеспечивает высокую
скорость получения нужной информации.
5

6.

Режимы доступа
Режимы доступа к файлу содержатся в перечислении FileAccess,
определенном в пространстве имен System.IO.
Константы перечисления
Значение
Описание
Read
Открыть файл только для чтения
ReadWrite
Открыть файл для чтения и записи
Write
Открыть файл только для записи
6

7.

Режимы открытия
Значения перечисления FileMode
Значение
Описание
Append
Открыть файл, если он существует, и установить текущий
указатель в конец файла. Если файл не существует, создать
новый файл
Create
Создать новый файл. Если в каталоге уже существует файл с
таким же именем, он будет стерт
CreateNew
Создать новый файл. Если в каталоге уже существует файл с
таким же именем, возникает исключение IOException
Open
Открыть существующий файл
OpenOrCreate
Открыть файл, если он существует. Если нет, создать файл с
таким именем
Truncate
Открыть существующий файл. После открытия он должен
быть обрезан до нулевой длины
7

8.

Режимы совместного
использования
Режимы совместного использования файла различными пользователями
определяет перечисление FileShare
Значение
Описание
None
Совместное использование открытого файла запрещено. Запрос на
открытие данного файла завершается сообщением об ошибке
Read
Позволяет открывать файл для чтения одновременно нескольким
пользователям. Если этот флаг не установлен, запросы на открытие
файла для чтения завершаются сообщением об ошибке
ReadWrite
Wri te
Позволяет открывать файл для чтения и записи одновременно
нескольким пользователям
Позволяет открывать файл для записи одновременно нескольким
пользователям
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
8

9.

Двоичное представление данных
BinaryReader – класс Считывает простые типы данных как двоичные
значения в заданной кодировке.
Элемент
Описание
Close
Закрывает текущий поток чтения и связанный с ним базовый поток.
Read(Byte[], Считывает указанное количество байтов из потока, начиная с заданной
Int32, Int32) точки в массиве байтов.
ReadByte
Считывает из текущего потока следующий байт и перемещает текущую
позицию в потоке на один байт вперед.
ReadChar
Считывает следующий знак из текущего потока
ReadInt32
Считывает целое число со знаком длиной 4 байта
ReadDouble Считывает число с плавающей запятой длиной 8 байт
ReadString
Считывает строку из текущего потока.
9

10.

double[] numbers = new double[20];
using (var writer = new BinaryWriter(File.OpenWrite("file.bin")))
{
foreach (double number in numbers)
writer.Write(number);
}
using (var reader = new BinaryReader(File.OpenRead("file.bin")))
{
for (int i = 0; i < numbers.Length; i++)
numbers[i] = reader.ReadDouble();
}
10

11.

Потоки байтов
Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream,
который является наследником абстрактного класса Stream, определяющего
набор стандартных операций с потоками.
Элемент
Описание
BeginRead,
BeginWrite
Начать асинхронный ввод или вывод
Length
Возвратить длину потока в байтах
Read, ReadByte
Считать последовательность байтов (или один байт) из
текущего потока и переместить указатель в потоке на
количество считанных байтов
Seek
Установить текущий указатель потока на заданную позицию
Wri te,
WriteByte
Записать последовательность байтов (или один байт) в
текущий поток и переместить указатель в потоке на количество
записанных байтов
Close
Закрыть текущий поток и освободить связанные с ним ресурсы
(сокеты, указатели на файлы и т. п.)
11

12.

FileStream f = new FileStream(@"TextFile1.txt", FileMode.Create,
FileAccess.ReadWrite);
f.WriteByte(100); // начало файла записывается число 100
byte[] x = new byte[10];
for ( byte i = 0; i < 10; ++i )
fs.Seek(10, SeekOrigin.Begin);
{
x[i] = (byte)( 10 - i );
f.WriteByte(i); // записывается 10 чисел от 0 до 9
}
fs.Seek(0, SeekOrigin.End);
f.Write( x, 0, 5 ); // записывается 5 элементов массива
byte[] у = new byte[20];
f.Seek( 0, SeekOrigin.Begin ); // текущий указатель - на начало
fs.Seek(-10, SeekOrigin.Current);
f.Read( у, 0, 20 ); // чтение из файла в массив
foreach ( byte elem in у ) Console.Write( " " + elem );
Console.WriteLine();
Console.ReadLine();
12

13.

// вспомогательные переменные
byte[] buffer = new byte[100];
ASCIIEncoding ascii = new ASCIIEncoding();
FileStream fs = new FileStream("1.txt",FileMode.Open,
FileAccess.ReadWrite);
int readed = fs.Read(buffer, 0, 100);
while (readed > 0)
{
Console.WriteLine(ascii.GetString(buffer));
readed = fs.Read(buffer, 0, 100);
}
Console.ReadKey();
13

14.

// Получаем объект типа FileStream
FileStream fStream = File.Open(@"C:\temp\test.dat", FileMode.Create);
// Кодируем строку в виде массива байтов
string txt = "Test!";
byte[] txtByteArray = Encoding.Default.GetBytes(txt);
// Записываем массив в файл
fStream.Write(txtByteArray, 0, txtByteArray.Length);
//Сбрасываем position
fStream.Position = 0;
// Читаем из файла и выводим на консоль
byte[] bytesFromFile = new byte[txtByteArray.Length];
for (int i = 0; i < txtByteArray.Length; i++)
{
bytesFromFile[i] = (byte)fStream.ReadByte();
Console.Write(bytesFromFile[i]); }
Console.WriteLine();
// Декодируем сообщение и выводим.
Console.Write("Декодированное сообщение: ");
Console.WriteLine(Encoding.Default.GetString(bytesFromFile));
14

15.

Потоки символов
StreamWriter и StreamReader
Элемент
Описание
Close
Закрыть файл и освободить связанные с ним ресурсы.
Flush
Очистить все буферы для текущего файла и записать накопленные
в них данные в место их постоянного хранения. Сам файл при этом
не закрывается
NewLine
Используется для задания последовательности символов, означающих
начало новой строки.
Write
Записать фрагмент текста в поток
WriteLinе
Записать строку в поток и перейти на другую строку
Read
Считать данные из входного потока
ReadBlock
Считать из входного потока указанное пользователем количество
символов и записать их в буфер, начиная с заданной позиции
ReadLine
Считать строку из текущего потока и возвратить ее как значение
типа string. Пустая строка (null) означает конец файла (EOF)
ReadToEnd
Считать все символы до конца потока, начиная с текущей позиции,
и возвратить считанные данные как одну строку типа stri ng
15

16.

Пример чтения из текстового файла
static void Main() // весь файл -> в одну строку
{
try
{
StreamReader f = new StreamReader( "text.txt" );
string s = f.ReadToEnd();
Console.WriteLine(s);
f.Close();
}
catch( FileNotFoundException e )
{
Console.WriteLine( e.Message );
Console.WriteLine( " Проверьте правильность имени файла!" );
return;
}
catch
{
Console.WriteLine( " Неопознанное исключение!" );
return;
}
}
16

17.

Построчное чтение текстового файла
StreamReader f = new StreamReader( "text.txt" );
string s;
long i = 0;
while ( ( s = f.ReadLine() ) != null ) Console.WriteLine( "{0}: {1}", ++i, s );
f.Close();
17

18.

Чтение целых чисел из текстового файла
try {
List<int> list_int = new List<int>();
StreamReader file_in = new StreamReader( @"D:\FILES\1024" );
Regex regex = new Regex( "[^0-9-+]+" );
List<string> list_string = new List<string>(
regex.Split( file_in.ReadToEnd().TrimStart(' ') ) );
foreach (string temp in list_string)
list_int.Add( Convert.ToInt32(temp) );
foreach (int temp in list_int) Console.WriteLine(temp);
...
}
catch (FileNotFoundException e)
{ Console.WriteLine("Нет файла" + e.Message); return; }
catch (FormatException e)
{ Console.WriteLine(e.Message); return; }
catch { … }
18

19. Вывод содержимого файла на C#

Console.OutputEncoding =Encoding.GetEncoding(866);
StreamReader sr = new
StreamReader("file.txt",System.Text.Encoding.Default);
FileInfo fl = new FileInfo("1.txt");
Console.OutputEncoding = Encoding.GetEncoding(866);
StreamReader sr = new StreamReader("1.txt",
System.Text.Encoding.Default);
string s;
while (sr.EndOfStream != true)
{
s = sr.ReadLine();
Console.WriteLine(s);
}
sr.Close();
Console.ReadLine()
19

20.

Работа с каталогами и файлами
Пространство имен System.IO: классы
➢Directory, DirectoryInfo
➢File, FileInfo
(создание, удаление, перемещение файлов и каталогов, получение их
свойств)
20

21.

Элементы класса DirectoryInfo
Элемент
Create
CreateSubDirectory
Delete
GetDirectories
GetFiles
MoveTo
Parent
Описание
Создать каталог или подкаталог по указанному пути в
файловой системе
Удалить каталог со всем его содержимым
Возвратить массив строк, представляющих все подкаталоги
Получить файлы в текущем каталоге в виде массива объектов
класса FileInfo
Переместить каталог и все его содержимое на новый адрес в
файловой системе
Возвратить родительский каталог
DirectoryInfo d = new DirectoryInfo("C:\Files");
DirectoryInfo d = new DirectoryInfo(@"C:\Files\Den");
d.Create(); // создаем новый каталог
DirectoryInfo d = new DirectoryInfo(@"C:\Files\Den");
d.CreateSubdirectory("Data");
d.CreateSubdirectory(@"Help\Html");
21

22. DirectoryInfo

DirectoryInfo d = new DirectoryInfo(@"C:\Test");
Console.WriteLine("FullName: {0}", d.FullName);
Console.WriteLine("Name: {0}", d.Name);
Console.WriteLine("Parent: {0}", d.Parent);
Console.WriteLine("Creation: {0}", d.CreationTime);
Console.WriteLine("Attributes: {0}", d.Attributes);
Console.WriteLine("Root: {0}", d.Root);
DirectoryInfo d = new DirectoryInfo(@"C:\test");
FileInfo[] files = d.GetFiles("*.doc", SearchOption. AllDirectories);
Console.WriteLine("Found {0} documents", files.Length);
// Выводим файлы:
foreach (FileInfo f in files)
{
Console.WriteLine("Filename: {0}", f.Name);
Console.WriteLine("Size: {0}", f.Length);
Console.WriteLine("Attributes: {0}", f.Attributes);
}
22

23.

Пример:
class Class1
// из каталога d:\foto в каталог d:\temp
static void Main() {
try {
string destName = @"d:\temp\";
DirectoryInfo dir = new DirectoryInfo( @"d:\foto" );
if ( ! dir.Exists )
// проверка существования каталога
{
Console.WriteLine( "Каталог " + dir.Name + " не сущ." );
return;
}
DirectoryInfo dest = new DirectoryInfo( destName );
dest.Create();
// создание целевого каталога
23

24.

FileInfo[] files = dir.GetFiles( "*.jpg" ); //список файлов
foreach( FileInfo f in files )
f.CopyTo( dest + f.Name );
// копирование файлов
Console.WriteLine( "Скопировано файлов " + files.Length);
}
// конец блока try
catch ( Exception e )
{
Console.WriteLine( "Error: " + e.Message );
}
}
}
24

25. FileInfo

Create()
Создает новый файл и возвращает объект FileStream, который
используется для взаимодействия с созданным файлом.
CreateText()
Создает объект StreamWriter, который используется для создания
текстового файла.
CopyTo()
Копирует существующий файл в другой файл.
AppendText()
Создает объект StreamWriter для добавления текста в файл
Delete()
Удаляет файл, связанный с экземпляром FileInfo
Directory
Используется для получения экземпляра родительского каталога
DirectoryName
Содержит полный путь к родительскому каталогу
Length
Получает размер текущего файла или каталога
MoveTo()
Используется для перемещения файла
Name
Содержит имя файла
Open()
Открывает файл с различными разрешениями чтения/
записи
25

26. FileInfo

OpenRead()
Создает доступный только для чтения объект FileStream
OpenText()
Создает объект StreamReader для чтения информации из текстового
файла
OpenWrite()
Создает объект FileStream, доступный только для записи
26

27. FileInfo

FileInfo myFile = new
FileInfo(@"C:\temp\file.vdd");
FileStream fs = myFile.Create();
// производим какие-либо операции с fs
// закрывам поток
fs.Close();
FileInfo mf = new FileInfo(@"C:\temp\file.vdd");
FileStream fs = mf.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite,
FileShare.None);
FileInfo f = new FileInfo(@"C:\temp\1.dat");
using (FileStream ro = f.OpenRead())
{ // выполняем операции чтения из файла }
FileInfo f2 = new FileInfo(@"C:\temp\2.dat");
using (FileStream rw = f2.OpenWrite())
{// записываем в файл
}
27

28. FileInfo

FileInfo txt = new FileInfo(@"program.log");
using (StreamReader txt_reader = txt.OpenText())
{
// Читаем данные из текстового файла
}
FileInfo f = new FileInfo(@"C:\temp\1.txt");
using (StreamWriter sw = f.CreateText())
{
// Записываем данные в файл...
}
FileInfo f = new FileInfo(@"C:\temp\2.txt");
using (StreamWriter swa = f.AppendText())
{
// Добавляем данные в текстовый файл
}
28

29.

29

30.

30
English     Русский Rules