Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Использование класса System::IO::FileStream для работы с файлами




(http://msdn.microsoft.com/ru-ru/library/system.io.filestream.aspx)

 

Формат объявления объекта FileStream имеет следующий вид:

 

FileStream^ fs = gcnew FileStream(fileName, mode, [access],

                              [share], [bufferSize], [options]);

где:

fileName – строка, содержащая полное имя файла, связанного с объектом FileStream;

mode     – константа из перечисления System::IO::FileMode, определяющая способ открытия или создания файла (таблица 11.8);

access    – константа из перечисления System::IO::FileAccess, определяющая способ доступа к файлу (таблица 11.8);

share     – константа из перечисления System::IO::FileShare, определяющая способ совместного использования файла процессами (таблица 11.8);

bufferSize – значение (Int32, большее 0), определяющее размер буфера в байтах. Для значений от 0 до 8 фактический размер буфера устанавливается равным 8 байт;

options  – константа из перечисления System::IO::FileOptions, задающая дополнительные параметры файла (таблица 11.8).

 

Таблица 11.15. Основные свойства и методы класса FileStream
из пространства имен System::IO

Имя Описание
Свойства  
CanRead Получает значение, определяющее наличие поддержки операций чтения в текущем потоке (true или false).
CanSeek Получает значение, определяющее наличие поддержки операций поиска в текущем потоке (true или false).
CanTimeout Получает значение, показывающее, может ли для данного потока истечь время ожидания (для большинства реализаций потока равно false).
CanWrite Получает значение, определяющее наличие поддержки операций записи в текущем потоке (true или false).
IsAsync Получает значение, определяющее, как был открыт FileStream – синхронно (false) или асинхронно (true).
Length Получает длину потока в байтах.
Name Получает имя FileStream, передаваемое в конструктор.
Position Получает или задает текущую позицию этого потока.
ReadTimeout Получает или задает значение (в миллисекундах), определяющее период, в течение которого поток будет пытаться выполнить операцию чтения, прежде чем истечет время ожидания.
WriteTimeout Получает или задает значение (в миллисекундах), определяющее период, в течение которого поток будет пытаться выполнить операцию записи, прежде чем истечет время ожидания.
  Методы  
BeginRead(arB,sI, nB,cal,v); Начинает операцию асинхронного чтения. Аргументы метода: arB – буфер (байтовый массив), в который необходимо считать данные; sI – смещение байтов в буфере, с которого начинается запись данных, считанных из потока; nB – максимальное число байтов, предназначенных для чтения; cal – метод, вызываемый после завершения операции асинхронного чтения; v – предоставляемый пользователем объект, являющийся отличительным признаком данного конкретного запроса на асинхронное чтение от других запросов.
BeginWrite(arB,sI, nB,cal,v); Начинает операцию асинхронной записи. Аргументы метода: arB – буфер (байтовый массив), содержащий данные для записи в текущий поток; sI – смещение байтов в буфере, с которого начинается копирование байтов в текущий поток; nB – максимальное число байтов, предназначенных для записи; cal – метод, вызываемый после завершения операции асинхронной записи; v – предоставляемый пользователем объект, являющийся отличительным признаком данного конкретного запроса на асинхронную запись от других запросов.
Close(); Закрывает FileStream и освобождает все системные ресурсы, связанные с FileStream.
CopyTo(StrmDest); CopyTo(StrmDest,ib); Считывает байты из текущего потока и записывает их в другой поток (StrmDest), используя указанный размер буфера (ib).
CopyToAsync (StrmDest); CopyToAsync (StrmDest,ib); CopyToAsync (StrmDest,ib,token); Асинхронно считывает байты из текущего потока и записывает их в другой поток (StrmDest), используя указанный размер буфера (ib) и токена (token) для отслеживания запросов отмены (по умолчанию – None).
EndRead(asyncRes); Ожидает завершения отложенной асинхронной операции чтения и возвращает число байтов, считанных из потока. Аргументом метода является ссылка на ожидаемый отложенный асинхронный запрос (asyncRes).
EndWrite(); Ожидает завершения асинхронной операции записи. Аргументом метода является ссылка на ожидаемый отложенный асинхронный запрос (asyncRes).
Lock(i,n); Запрещает другим процессам чтение объекта FileStream или запись в этот объект.
Read(arB,i,n); Выполняет чтение блока байтов из потока (файла) и запись в заданный буфер (массив байтов – arB), n байтов, начиная с i-го.
ReadAsync(arB,i,n); Асинхронно считывает в буфер (массив байтов – arB) последова-тельность байтов (n байтов) из текущего потока (файла), начиная с i-ой позиции, и перемещает позицию в потоке на число считан-ных байтов. Имеется в .NET Framework начиная с версии 4.5.
ReadByte(); Считывает байт из файла и перемещает позицию чтения на один байт.
Seek(is,so); Устанавливает текущее положение данного потока на заданное значение, определяемое путем смещения (is) относительно опорной точки (so). Опорная точка задается константой из перечисления SeekOrigin (Begin – начало потока, Current – текущее положение в потоке, End – конец потока).
SetLength(L); Устанавливает длину данного потока на заданное значение (L).
Unlock(i,n); Разрешает доступ другим процессам ко всему ранее заблокиро-ванному файлу или его части (n байтов, начиная с i-го).
Write(arB,i,n); Записывает в поток (файл) блок байтов из буфера (массива байтов – arB), n байтов, начиная с i-го.
WriteAsync(arB,i,n); Асинхронно записывает из буфера (массив байтов – arB) последовательность байтов (n байтов) в текущий поток (файл), начиная с i-ой позиции, и перемещает текущую позицию внутри потока на число записанных байтов. Имеется в .NET Framework начиная с версии 4.5.
WriteByte(); Записывает байт в текущую позицию в потоке (файле).

 

Пример 11.14. Использование свойств CanRead и CanWrite класса FileStream для определения возможности чтения и записи файла. Результатом выполнения этого примера будет строка: "Файл c:\temp\Test.txt не перезаписываем". Чтобы получить выходное сообщение "Файл c:\temp\Test.txt может быть использован для записи и чтения.", нужно изменить в конструкторе FileStream параметр FileAccess на ReadWrite.

 

#include "stdafx.h"

using namespace System;

using namespace System::IO;

int main() {

  String^ fname = "c:\\temp\\Test.txt";

FileStream^ fs = gcnew FileStream(fname, FileMode::OpenOrCreate,

                                 FileAccess::Read);

if (fs->CanRead && fs->CanWrite)

  Console::WriteLine("Файл {0} может быть использован " +

                     "для записи и чтения.", fname);

else if (fs->CanRead)

  Console::WriteLine("Файл {0} не перезаписываем.", fname);

Console::ReadLine();

  return 0;

}

 

Пример 11.15. Использование свойств Length и Name, а также методов WriteByte и ReadByte класса FileStream для записи данных в файл (байт за байтом) и проверки правильности записанных данных.

 

#include "stdafx.h"

using namespace System;

using namespace System::IO;

int main() {

String^ fileName = "c:\\temp\\MyTest.txt";

// Генерация случайных данных для записи в файл.

array<unsigned char>^ dataArray = gcnew

                                 array<unsigned char>(1000);

Random^ rnd = gcnew Random;

rnd->NextBytes(dataArray);

FileStream^ fileStream = gcnew FileStream(fileName,

                                         FileMode::Create);

// Запись данных в файл байт за байтом.

for (int i = 0; i < dataArray->Length; i++)

   fileStream->WriteByte(dataArray[i]);

// Установка потоковой позиции в начало файла.

fileStream->Seek(0, SeekOrigin::Begin);

// Чтение и проверка данных.

for (int i = 0; i < fileStream->Length; i++)

   if (dataArray[i] != fileStream->ReadByte()) {

      Console::WriteLine("Ошибка записи данных.");

      return 0;

   }

Console::WriteLine("Данные были записаны в файл {0} и " +

                  "проверены.", fileStream->Name);

Console::ReadLine();

  return 0;

}

/* Вывод:

Данные были записаны в файл c:\temp\MyTest.txt и проверены.

*/

 

Пример 11.16. Использование свойства Length, а также методов Readи Write класса FileStream для считывания содержимого одного файла и записи его в другой файл.

 

#include "stdafx.h"

using namespace System;

using namespace System::IO;

int main() {

// Определение файла для чтения и нового файла (для записи).

String^ pathSource = "c:\\temp\\Source.txt";

String^ pathNew = "c:\\temp\\newFile.txt";

FileStream^ fsSource = gcnew FileStream(pathSource,

                            FileMode::Open, FileAccess::Read);

// Чтение исходного файла в байтовый массив.

array<unsigned char>^ bytes = gcnew

                     array<unsigned char>(fsSource->Length);

int numBytesToRead = (int)fsSource->Length;

int numBytesRead = 0;

while (numBytesToRead > 0) {

     // Чтение возвращает значение от 0 до numBytesToRead.

     int n = fsSource->Read(bytes, numBytesRead,

                            numBytesToRead);

     if (n == 0) break; // Выход из цикла, если конец файла

     numBytesRead += n;

     numBytesToRead -= n;

}

numBytesToRead = bytes->Length;

// Вывод на экран:

Console::WriteLine("Файл {0} прочитан.", pathSource);

Console::WriteLine("Массив считанных байтов:");

for (int i = 0; i < bytes->Length; i++)

   Console::WriteLine(bytes[i]);

// Запись байтового массива в другой FileStream (в новый файл).

FileStream^ fsNew = gcnew FileStream(pathNew, FileMode::Create,

                                    FileAccess::Write);

fsNew->Write(bytes, 0, numBytesToRead);

Console::WriteLine("Файл {0} записан.", pathNew);

Console::ReadLine();

  return 0;

}

/* Вывод:

Файл c:\temp\Source.txt прочитан.

Массив считанных байтов:

...

Файл c:\temp\newFile.txt записан.

*/

 

 










Последнее изменение этой страницы: 2018-05-10; просмотров: 231.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...