Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 6004.doc
Скачиваний:
20
Добавлен:
30.04.2022
Размер:
1.29 Mб
Скачать

4.3.6.4Потоки данных

NTFS поддерживает многочисленные потоки данных. Имя потока идентифицирует новый атрибут данных в файле. Потоки имеют раздельные блокировки opportunistic, блокировки файла, размеры размещения и размеры файла, но совместно используются как файл. Следующий пример иллюстрирует один из потоков:

myfile.dat :stream2

Эта возможность позволяет управлять связанными данными как отдельным модулем. Например, компьютеры Macintosh используют этот тип структуры для управления ветвлениями данных и ресурсами. Другим примером может служить библиотека файлов, в которой файлы определены как альтернативные потоки:

library: filel

: file2

: file3

Или предположим, что "интеллектуальный" транслятор создает структуру файла подобно следующей:

program: source_file

: doc_file

: object_file

: executable_file

Т. к. NTFS не поддерживается на гибких дисках, то при копировании файлов NTFS на гибкий диск потоки данных и другие необеспечиваемые FAT атрибуты теряются.

4.3.6.5Согласованность с posix

Согласованность с POSIX позволяет переносить приложения UNIX в среду Windows NT. Windows NT полностью согласована со стандартом 1003.1 института IEEE, который определяет присвоение имен и идентификацию файлов.

Следующие возможности POSIX включены в NTFS:

- Чувствительные к регистру имена. Для POSIX файлы READ- ME.TXT, Readme.txt и readme.txt являются различными.

- Жесткие связи (Нard links). Файлу может быть присвоено несколько имен. Это позволяет двум файлам с различными именами, которые могут быть размещены в различных каталогах, содержать одни и те же данные.

- Дополнительные отметки времени. Показывают, когда файл был последний раз использован или изменен.

Несмотря на то что NTFS поддерживает регистрозависимые имена, нельзя использовать стандартные операции NTFS для управления файлами, имена которых отличаются только регистром (к стандартным операциям относятся выполняемые из командной строки, типа copy, del, move и их эквиваленты в File Manager). Например, оба файла annm.doc и AnnM.Doc будут удалены при использовании следующей команды:

del AnnM.Doc

Таким образом, для управления файлами, имена которых отличаются только регистром, следует использовать приложения POSIX.

4.4.Асинхронные операции с файлами

Все ранее рассмотренные файловые функции Windows API обеспечивали синхронные операции над данными. Это означает, что приложение приостанавливает свою работу до завершения операции обмена с внешним устройством. Приложение, запущенное в среде Microsoft Windows NT, может совместить операции ввода-вывода с выполнением другой работы.

Когда функции ReadFile и WriteFile вызываются в асинхронном режиме, они только инициируют процесс чтения или записи, сразу же возвращая управление. Для выполнения операции операционной системой неявно создается отдельная задача. Ее синхронизация с вызвавшей задачей осуществляется с помощью объекта-события.

Открывая или создавая файл функцией CreateFile, следует указать флаг FILE_FLAG_OVERLAPPED. Перед вызовом функций ReadFile или WriteFile надо подготовить структуру типа OVERLAPPED и передать ее адрес этим функциям через параметр lpOverlapped. Структура OVERLAPPED определена следующим образом:

typedef struct _OVERLAPPED

{

DWORD Internal; // Зарезервировано

DWORD InternalНigН; // Зарезервировано

DWORD Offset; // Младшее слово позиции в файле

DWORD OffsetНigН; // Старшее слово позиции в файле

НANDLE НEvent; // Идентификатор события, который

// будет отмечен после завершения

// операции

} OVERLAPPED;

Объект-событие создается предварительно и его идентификатор передается функциям обмена для синхронизации. Если в качестве НEvent передать NULL, то будет использоваться идентификатор файла.

Например, для ожидания завершения обмена можно использовать функцию WaitForSingleObject(НFile, INFINITE) с идентификатором файла НFile в качестве первого параметра.

Кроме того, имеется специальная функция

BOOL GetOverlappedResult(

НANDLE НFile, // Идентификатор файла

LPOVERLAPPED lpOverlapped, // Адрес структуры OVERLAPPED

LPDWORD lpNumberOfBytesTransferred, // Адрес счетчика байтов

BOOL bWait); // Флаг ожидания

По адресу счетчика байтов записывается действительное количество прочитанных или записанных байт. Если задать bWait значение TRUE, то функция будет дожидаться завершения выполнения операции и вернет результат TRUE. При использовании значения FALSE функция проверяет завершенность операции и возвращает TRUE в случае успеха и FALSE, если операция еще не завершена.

Две дополнительные функции Windows API специально предназначены для выполнения асинхронных файловых операций:

BOOL ReadFileEx(

НANDLE НFile, // Идентификатор файла

LPVOID lpBuffer, // Адрес буфера

LPDWORD lpNumberOfBytesToRead, // Количество байт для чтения

LPOVERLAPPED lpOverlapped, // Адрес структуры OVERLAPPED

LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);

// адрес функции, вызываемой после завершения операции

BOOL WriteFileEx(

НANDLE НFile,

LPVOID lpBuffer,

LPDWORD lpNumberOfBytesToWrite,

LPOVERLAPPED lpOverlapped,

LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);

Через параметр lpCompletionRoutine передается адрес функции с прототипом

VOID WINAPI CompletionRoutine(

DWORD dwErrorCode, // Код завершения

DWORD dwNumberOfBytesTransferred, // Число переданных байтов

LPOVERLAPPED lpOverlapped); // Адрес структуры OVERLAPPED