Файловые потоки

Автор: Пользователь скрыл имя, 07 Июня 2012 в 17:30, курсовая работа

Краткое описание

Файловые потоки представляют объектно-ориентированный способ чтения и записи информации в дисковые файлы. Библиотека файловых потоков разработана для работы только с текстовыми файлами. Однако можно применить ее и для чтения и записи двоичных значений, текстов, структур или любых других объектов.

Оглавление

Введение.............................................................................................................. 3
Классы потоков ........................................................................................... 4
Стандартные потоки ...................................................................... 6
Файловые потоки ........................................................................................ 8
2.1. Возможности работы потока
TStream - TFileStream - файловый поток ...........................................8
Работа с файловыми потоками в С++ ........................................................10
Stream-библиотека С++ ....................................................................10
Функция-компонент open ................................................................11
Последовательный текстовый поток ввода/вывода .......................13
Функция-элемент getline ..................................................................13
Последовательный двоичный файловый ввод/вывод ....................14
Функция-элемент write .....................................................................15
Функция-элемент read .......................................................................16
Файловый ввод/вывод с прямым доступом ....................................16
Функция-компонент seekg ................................................................17
Файловые потоки в NTFS .............................................................................18
Физическая структура NTFS ............................................................18
Обзор структуры разделов ...............................................................19
Файлы и потоки .................................................................................21
Работа с файловыми потоками в NTFS ...........................................23
Работа с потоками из консоли .........................................................25
Заключение ...........................................................................................................27
Список использованной литературы .............................................

Файлы: 1 файл

КУРСОВАЯ.docx

— 53.92 Кб (Скачать)
    1. Физическая  структура NTFS
 

     Теоретически, NTFS раздел может быть почти любого размера. Максимальный размер раздела NTFS сегодня ограничен лишь размерами самих жестких дисков. Вероятно, при попытке установки на раздел с NT4 могут возникнуть некоторые проблемы, если какая-либо из его частей будет удалена более чем на 8 Гбайт от физического начала диска, но эта проблема относится только к загрузке раздела.

     Способ  инсталляции NT4.0 на пустой диск довольно оригинален и может привести к  неправильной оценке возможностей NTFS. Если вы используете инсталляционную  программу, которой хотите отформатировать  диск в NTFS, то максимальный размер, предложенный вам, составит только 4 Гбайта. Почему же так мало, если размер раздела NTFS не ограничен? Ответ следующий –  установка просто не знает данной файловой системы. Программа установки  форматирует этот диск в обычный FAT, максимальный размер которого в NT составляет 4 Гбайта (при использовании не совсем стандартного огромного кластера 64 Кб), а NT устанавливается в этот FAT. В ходе первой загрузки операционной системы (на этапе установки), раздел быстро преобразуются в NTFS, это реализовано  так, что пользователь ничего не замечает, кроме странного "ограничения" на размер NTFS во время установки.  

    1. Обзор структуры разделов
 

     Как и любая другая система NTFS делит  всё пространство на кластеры - временные  блоки данных. NTFS поддерживает почти  все размеров кластеров - от 512 байт до 64 Кбайт. 4 Кбайтный кластер считается  стандартным. В структуре кластера NTFS нет каких-либо аномалий и мне  нечего об этом сказать.

     NTFS раздел символически разделен  на две части. Первые 12% раздела  предназначены для так называемой MFT зоны - пространства, которое содержит  метафайл MFT. Любая запись данных  в эту область невозможна. MFT-область  всегда необходимо держать пустой  и не допускать разделения  наиболее важного служебного  файла (MFT). Остальные 88% диска представляют  собой обычное пространство для  хранения файлов.

     Свободное места на диске, однако, включает в  себя все физически свободное  место - свободная часть MFT зоны включается туда же. Механизм MFT области используется следующим образом: когда файлы  уже не могут быть записаны в обычное  пространство, MFT зона просто сокращается (в текущих версиях операционных систем в два раза) освобождая место  для записи файлов. На очищенной  используемой области, MFT может быть снова расширена. Таким образом, существует возможность нахождения обычных файлов в этой области, и  такая ситуация нормальна. Система  пыталась держать его бесплатно, но потерпели неудачу. Жизнь продолжается ... Метафайл MFT все же может быть фрагментирован, хотя это очень нежелательно.

     Файловая  система NTFS является выдающимся достижением  структуризации: каждый компонент системы  является файлом - даже системная информация. Наиболее важный файл в NTFS называется MFT или главной таблицей файлов (Master File Table). Он расположен в MFT области и представляет собой централизованный каталог всех остальных файлов диска, и себя в том числе. MFT делится на записи фиксированного размера (обычно 1 Кбайт), и каждая запись соответствует своему файлу. Первые 16 файлов служебные, и они недоступны для операционной системы. Эти файлы называются метафайлами, самым первым среди которых является MFT. Эти первые 16 элементов MFT являются лишь частью диска, имеющей фиксированную позицию Интересно, что вторая копия первых 3 записей, для надежности (они очень важны) хранится в самой середине диска. Остальные MFT-файлы могут быть сохранены также как любые другие файлы в любом месте диска. Вполне возможно восстановление их позиции, используя в качестве основы первый элемент MFT.

     Первые 16 файлов NTFS (метафайлы) являются системными. Каждый из них отвечает за некоторый  аспект работы системы. Преимущество такого модульного подхода заключается  в удивительной гибкости - например, физические неисправности в FAT области  являются губительными для всех операций с диском. Что касается NTFS, она  может перемещать и даже фрагментировать  на диске все системные области, избегая каких-либо повреждений  его поверхности, за исключением  первых 16 элементов MFT.

     Метафайлы располагаются в корневом каталоге диска NTFS, их имена начинаются с символа "$", хотя какую-либо информацию о  них получить стандартными средствами достаточно трудно. Любопытно, что даже для этих файлов указывается вполне реальный размер, и можно, например, узнать, сколько операционная система  тратит на каталогизацию всего вашего диска, посмотрев размер файлов $MFT. В следующей таблице, указаны  используемые сейчас метафайлы и  их функции.

     Метафайл Описание

     $MFT  Сам MFT файл

     $MFTmirr  Копия первых 16 записей MFT размещённых в середине диска

     $LogFile  Файл поддержки журналирования

     $Volume  Служебная информация - метка тома, версия файловой системы и т.д.

     $AttrDef  Список стандартных атрибутов файлов тома

     $.  Корневой каталог

     $Bitmap  Битовая карта свободного пространства тома

     $Boot  Загрузочный сектор (загрузочный раздел)

     $Quota  Файл, в котором регистрируются права пользователей на использование дискового пространства (начал работать с NT5)

     $Upcase  Файл - таблица соответствий между заглавными и строчными буквами в именах файлов текущего тома Она необходима потому, что в NTFS имена файлов хранятся в Unicode, что составляет 65 тысяч различных символов, и это не просто искать их большие и малые эквиваленты. 

    1. Файлы и потоки
 

     Итак, система имеет файлы и ничего кроме файлов. Что включает в себя эта концепция NTFS?

     Прежде  всего, обязательным элементом является запись в MFT. Как было сказано выше, все файлы диска упоминаются  в MFT. Вся информация о файле, за исключением  данных, сама находится в этом месте: имя файла, его размер, позиции  на диске отдельных фрагментов и  т.д. Если одной MFT записи не достаточно на информацию, тогда используются несколько записей и не обязательно  одна за другой.

     Необязательный  элемент - потоки данных файла. Определение "необязательный", кажется, несколько  странным, но, тем не менее, здесь  нет ничего странного. Во-первых, файл может не иметь данных, и в этом случае свободное место на диске  он не использует. Во-вторых, файл может  быть не очень большого размера. Тогда  довольно успешно применяется следующее  решение: данные файла хранятся только в MFT, в местах, свободных от главных данных в пределах одной записи MFT. Файлы с размером сотни байт, обычно не имеют "физического" отображения в основной файловой области. Все данные подобных файлов хранятся в одном месте - в MFT.

     Существует  интересный случай с файлом данных. Каждый файл на NTFS имеет довольно абстрактное  устройство - у него нет данных, у  него есть потоки. Один из потоков имеет  привычный для нас смысл –данных  файла. Однако большинство атрибутов  файла также потоки! Таким образом, мы видим, что обязательным для файла  является только номер в MFT, а остальное  – необязательно. Данное обобщение  может использоваться для создания довольно удобных вещей - например, можно "прикрепить" еще один поток  в файл, имеющий отчет о каких-либо данных в нём - например, информация об авторе и содержании файла, как  это было в Windows 2000 (наиболее правильная закладка в свойствах файла, доступная  из проводника). Интересно, что эти  дополнительные потоки не видны стандартными средствами: наблюдаемый размер файла  включает только размер основного потока, содержащего традиционные данные. Вполне возможно, например, иметь файл нулевой  длинны, после удаления которого освобождается 1 Гбайт пространства только потому, что некоторые программы или  технология прикрепила дополнительных поток (альтернативные данные) гигабайтного размер. Но на самом деле на момент потоки практически не используются, поэтому  мы можем не бояться таких ситуаций, хотя они и являются гипотетически  возможными. Просто имейте в виду, что  файл в NTFS гораздо более глубокая и более глобальная концепция, чем  можно себе представить, только наблюдая каталоги на диске. Ну и, наконец: имя  файла может содержать любые  символы, включая полный набор национальных алфавитов, поскольку данные содержатся в Unicode - 16-битное представление которых  дает 65535 разных символов. Максимальная длина имени файла 255 символов. 

    1. Работа  с файловыми потоками в NTFS
 

     В работе с файлами и потоками есть и сходства, и различия. 

   Сходства:

  • и файлы, и их потоки создаются и удаляются одними и теми же WinAPI функциями: CreateFile и DeleteFile.
  • Чтение и запись реализуются, соответственно, функциями ReadFile и WriteFile.

   Различия:

  • В именах потоков могут содержаться спецсимволы, которые не могут быть частью имени нормального файла. Например, «*»,«?», «<», «>», «|» и кавычки. Вообще, любое имя потока сохраняется в формате Unicode. Стало быть, в названиях могут использоваться и служебные символы из диапазона 0x01 - 0x20.
  • Нет стандартной функции копирования и переноса потока: MoveFile и CopyFile с потоками не работают. Хотя можно написать свои собственные функции.
  • У потоков отсутствуют собственные атрибуты, такие, как дата создания и модификации: эти признаки наследуются от файла, к которому прикреплены потоки.

     Если  в самом файле присутствуют какие-либо данные, их тоже можно представить  в виде потока. Имена потоков строятся так: «имя_файла:имя_потока:атрибут». Стандартный  атрибут потока, в котором находятся  данные, называется $Data. Есть много других атрибутов, имена которых также  начинаются со знака «$». Содержимое файла находится в безымянном потоке (имя файла ::$DATA). С этим свойством  файловой системы представлять содержимое файла в виде потока был связан баг в старых версиях Microsoft IIS.

     Работа  с потоками, в общем-то, похожа на работу с файлами. В качестве простого примера посмотрим процедуру, создающую файл с потоком и записывающую в него информацию.

     Код:

procedure createstream();

var StreamText:array [0..255] of char;

namberofbytewritten,hfile:DWORD;

begin

StreamText:='this is stream'; hfile:=CreateFile('testfile:stream',GENERIC_WRITE,FILE_SHARE_WRITE,nil,OPEN_ALWAYS,0,0);

WriteFile(hfile,StreamText,length('this is stream'),namberofbytewritten,nil);

CloseHandle(hfile);

end;

     После запуска этого кода в ее каталоге появится абсолютно пустой (по мнению любого файлового менеджера) файл testfile. Увидеть содержимое прикрепленного потока можно, набрав в командной  строке more < testfile: stream. Имя потока указывается после имени файла, отделенное от него знаком двоеточия.

     Самое трудное при работе с потоками - это получить их список для конкретного  файла.

     Список  потоков 

     Как же можно получить список потоков, прикрепленных  к файлу? Воспользуемся стандартной функцией BackupRead, предназначенной для резервного копирования файлов. Когда делается резервная копия файла, важно сохранить как можно больше данных, включая и информацию в файловых потоках. Информация берется из структуры WIN32 STREAMJD. Оттуда можно узнать имя потока, его тип и размер. Нам понадобятся только потоки типа BACKUP_ALTERNATE_DATA. Все функции и структуры описаны в заголовочном файле winnt.h.

     Для начала надо открыть файл для чтения с помощью функции CreateFile. В параметре dwFlagsAndAttributes надо указать флаг FILE_FIAG_BACKU P_SEMANTICS, что позволит открывать не только файлы, но и каталоги. Затем запускается цикл while, который считывает информацию о файле в структуру sid, из которой достается информация о каждом потоке. Перед следующим проходом цикла очищаем структуру и сдвигаем указатель файла к следующему потоку с помощью функции BackupSeek. После того как все потоки найдены,  очищается IpContext, содержащий служебную информацию, и файл надо закрыть.

     Для работы с потоками совсем не обязательно писать специальные программы. Некоторые элементарные операции можно выполнять даже при помощи встроенных утилит windows:  

    1. Работа  с потоками из консоли
 

Создание  файла с потоком:

type nul > file.txt:Stream

Запись в поток:

echo "any text" >> file.txt:Stream

Чтение  из потока:

more < file.txt:Stream

Копирование содержимого файла в поток:

type file2.txt >> file.txt:Stream

Копирование содержимого потока в файл:

more < file.txt:Stream >> outfile.txt  
 
 

Обнаружение 

     Если  поток прикреплен к логическому  тому, то в Windows  нет стандартных  средств, чтобы его обнаружить. Так  как в имени потока могут содержаться  символы, недопустимые в именах обычных  файлов, это создает дополнительные трудности при попытке узнать содержимое потока, пользуясь командной  строкой. Содержимое сводки документа  обычно хранится в потоке с названием, которое содержит символ с кодом 0x0 Этот символ можно набрать в  консоли (Ctrl+E), но если бы это был  символ 0x10 или 0x13, то набрать их было бы невозможно. Tеоретически можем узнать о прикрепленных потоках случайно, используя некоторый софт, который с большой вероятность есть на вашем компьютере. В WinRAR есть опция «Сохранять потоки NTFS», и если он включена, то можно заметить, что размер небольшого файла, помещенного в архив, не только не уменьшается, а даже увеличивается (за счет того, что данные в папках тоже помещаются в архив). Это должно вызвать подозрения.

Информация о работе Файловые потоки