русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Потоки байтів


Дата додавання: 2015-01-08; переглядів: 968.


 

Уведення-виведення у файл на рівні байтів виконується за допомогою класу FileStream, який є спадкоємцем абстрактного класу Stream, що визначає набір стандартних операцій з потоками. Елементи класу Stream описані в таблиці 11.5.

 

Таблиця 11.5

Елементи класу Stream

 

Елемент Опис
BeginRead, BeginWrite Почати асинхронне введення або виведення
CanRead, CanSeek, CanWrite Властивості, що визначають, які операції підтримує потік: читання, прямий доступ і/або запис
Сlose Закрити поточний потік і звільнити пов'язані з ним ресурси (сокети, покажчики на файли і т. п.)
EndRead, EndWrite Чекати завершення асинхронного введення; закінчити асинхронне виведення
Flush Записати дані з буфера в пов'язане з потоком джерело даних і очистити буфер. Якщо для даного потоку буфер не використовується, то цей метод нічого не робить
Length Повернути довжину потоку в байтах
Position Повернути поточну позицію в потоці
Read, ReadByte Підрахувати послідовність байтів (або один байт) з поточного потоку і перемістити покажчик в потоці на кількість лічених байтів
Seek Встановити поточний покажчик потоку на задану позицію
SetLength Встановити довжину поточного потоку
Write, WriteByte Записати послідовність байтів (або один байт) в поточний потік і перемістити покажчик в потоці на кількість записаних байтів

 

Клас FileStream реалізує ці елементи для роботи з дисковими файлами. Для визначення режимів роботи з файлом використовуються стандартні перелічення FileMode, FileAccess і FileShare. Значення цих перелічень приведені в таблицях 11.2-11.4. У лістингу 11.1 представлений приклад роботи з файлом. У прикладі демонструються читання і запис одного байта і масиву байтів, а також позиціонування в потоці.

 

 

Лістинг 11.1. Приклад використання потоку байтів

using System;

using System.IO;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace examp74

{

class Class1

{

static void Main()

{

FileStream f = new FileStream( "test.txt",

FileMode.Create, FileAccess.ReadWrite );

f.WriteByte( 100 ); // у початок файлу записується число 100

byte[] х = new byte[10];

for ( byte i = 0; i < 10; ++i )

{

х[i] = (byte)(10 - i);

f.WriteByte(i); // записується 10 чисел від 0 до 9

}

f.Write(х, 0, 5); // записується 5 елементів масиву

byte[] у = new byte[20];

f.Seek( 0, SeekOrigin.Begin ); // поточний покажчик - на початок

f.Read( у, 0, 20 ); // читання з файлу в масив

foreach ( byte elem in у ) Console.Write( " " + elem );

Console.WriteLine();

f.Seek(5, SeekOrigin.Begin); // поточний покажчик - на 5-й елемент

int а = f.ReadByte(); // читання 5-го елементу

Console.WriteLine(а);

а = f.ReadByte(); // читання 6-го елементу

Console.WriteLine(а);

Console.WriteLine( " Поточна позиція в потоці " + f.Position );

f.Close();

}

}

}

 

Результат роботи програми:

100 01234 56789 10 98760000

Поточна позиція в потоці 7

Поточна позиція в потоці спочатку встановлюється на початок файлу (для будь-якого режиму відкриття, окрім Append) і зрушується на одну позицію при записі кожного байта.

Для установки бажаної позиції читання використовується метод Seek, що має два параметри: перший задає зсув в байтах щодо точки відліку, що задається другим. Точки відліку задаються константами перелічення SeekOrigin: початок файлу - Begin, поточна позиція - Current і кінець файлу - End.

У даному прикладі файл створювався в поточному каталозі. Можна вказати і повний шлях до файлу, наприклад:

 

FileStream f = new FileStream( @"D:\C#\test.txt",

FileMode.Create, FileAccess.ReadWrite );

 

Операції по відкриттю файлів можуть завершитися невдало, наприклад, при помилці в імені існуючого файлу або за відсутності вільного місця на диску, тому рекомендується завжди контролювати результати цих операцій.

У разі непередбачених ситуацій середовище виконання генерує різні виключення, обробку яких слід передбачити в програмі, наприклад:

· FileNotFoundException, якщо файлу у вказаному каталозі не існує;

· DirectoryNotFoundException, якщо не існує вказаний каталог;

· ArgumentException, якщо невірно заданий режим відкриття файлу;

· IOException, якщо файл не відкривається із-за помилок введення-виведення.

Можливі і інші виняткові ситуації.

Зручно обробляти найбільш вірогідні помилки роздільно, щоб надати користувачеві програми в повідомленні, що виводиться, найбільш точну інформацію. У приведеному далі прикладі окремо перехоплюється помилка в імені файлу, а потім обробляється решта всіх можливих помилок:

 

try

{

FileStream f = new FileStream(@"d:\C#\test.tx", FileMode.Open, FileAccess.Read );

// дії з файлом

f.Close();

}

catch( FileNotFoundException e)

{

Console.WriteLine( е.Message ) ;

Console.WriteLine( " Перевірте правильність імені файлу!" ); return;

}

catch( Exception e )

{

Console.WriteLine( "Error: " + e.Message ); return;

}

При закритті файлу звільняються всі пов'язані з ним ресурси, наприклад, для файлу, відкритого для запису, у файл вивантажується вміст буфера. Тому рекомендується завжди закривати файли після закінчення роботи, особливо файли, відкриті для запису. Якщо буфер потрібно вивантажити, не закриваючи файл, використовується метод Flush.


<== попередня лекція | наступна лекція ==>
РОЗДІЛ 11. РОБОТА З ФАЙЛАМИ | Асинхронне уведення-виведення


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн