Автор: Пользователь скрыл имя, 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
Список использованной литературы .............................................
Теоретически, NTFS раздел может быть почти любого размера. Максимальный размер раздела NTFS сегодня ограничен лишь размерами самих жестких дисков. Вероятно, при попытке установки на раздел с NT4 могут возникнуть некоторые проблемы, если какая-либо из его частей будет удалена более чем на 8 Гбайт от физического начала диска, но эта проблема относится только к загрузке раздела.
Способ
инсталляции NT4.0 на пустой диск довольно
оригинален и может привести к
неправильной оценке возможностей NTFS.
Если вы используете инсталляционную
программу, которой хотите отформатировать
диск в NTFS, то максимальный размер, предложенный
вам, составит только 4 Гбайта. Почему же
так мало, если размер раздела NTFS не
ограничен? Ответ следующий –
установка просто не знает данной
файловой системы. Программа установки
форматирует этот диск в обычный
FAT, максимальный размер которого в NT составляет
4 Гбайта (при использовании не совсем
стандартного огромного кластера 64
Кб), а NT устанавливается в этот FAT.
В ходе первой загрузки операционной
системы (на этапе установки), раздел
быстро преобразуются в NTFS, это реализовано
так, что пользователь ничего не замечает,
кроме странного "ограничения" на
размер NTFS во время установки.
Как и любая другая система NTFS делит всё пространство на кластеры - временные блоки данных. NTFS поддерживает почти все размеров кластеров - от 512 байт до 64 Кбайт. 4 Кбайтный кластер считается стандартным. В структуре кластера NTFS нет каких-либо аномалий и мне нечего об этом сказать.
NTFS
раздел символически разделен
на две части. Первые 12% раздела
предназначены для так
Свободное
места на диске, однако, включает в
себя все физически свободное
место - свободная часть 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 тысяч различных символов, и это не просто
искать их большие и малые эквиваленты.
Итак, система имеет файлы и ничего кроме файлов. Что включает в себя эта концепция NTFS?
Прежде всего, обязательным элементом является запись в MFT. Как было сказано выше, все файлы диска упоминаются в MFT. Вся информация о файле, за исключением данных, сама находится в этом месте: имя файла, его размер, позиции на диске отдельных фрагментов и т.д. Если одной MFT записи не достаточно на информацию, тогда используются несколько записей и не обязательно одна за другой.
Необязательный элемент - потоки данных файла. Определение "необязательный", кажется, несколько странным, но, тем не менее, здесь нет ничего странного. Во-первых, файл может не иметь данных, и в этом случае свободное место на диске он не использует. Во-вторых, файл может быть не очень большого размера. Тогда довольно успешно применяется следующее решение: данные файла хранятся только в MFT, в местах, свободных от главных данных в пределах одной записи MFT. Файлы с размером сотни байт, обычно не имеют "физического" отображения в основной файловой области. Все данные подобных файлов хранятся в одном месте - в MFT.
Существует
интересный случай с файлом данных.
Каждый файл на NTFS имеет довольно абстрактное
устройство - у него нет данных, у
него есть потоки. Один из потоков имеет
привычный для нас смысл –
В работе с файлами и потоками есть и сходства, и различия.
Сходства:
Различия:
Если
в самом файле присутствуют какие-либо
данные, их тоже можно представить
в виде потока. Имена потоков строятся
так: «имя_файла:имя_потока:атрибут»
Работа с потоками, в общем-то, похожа на работу с файлами. В качестве простого примера посмотрим процедуру, создающую файл с потоком и записывающую в него информацию.
Код:
procedure createstream();
var StreamText:array [0..255] of char;
namberofbytewritten,hfile:
begin
StreamText:='this
is stream'; hfile:=CreateFile('testfile:
WriteFile(hfile,StreamText,
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:
Создание файла с потоком:
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», и если он включена, то можно заметить, что размер небольшого файла, помещенного в архив, не только не уменьшается, а даже увеличивается (за счет того, что данные в папках тоже помещаются в архив). Это должно вызвать подозрения.