+ All Categories
Home > Documents > Пособ ие по специ альности 071900 ОПДФ.11 Операци онные...

Пособ ие по специ альности 071900 ОПДФ.11 Операци онные...

Date post: 13-May-2020
Category:
Upload: others
View: 12 times
Download: 0 times
Share this document with a friend
35
М И НИ СТ ЕРСТ В О О БРА ЗО В А Н И Я РФ В О РО НЕ Ж СКИ Й Г О СУДАРСТ В Е ННЫ Й УНИ В Е РСИ Т Е Т П особие по сп е циал ь н ости071900 ОПД .Ф .11 О п ерацион н ы е систе мы Ф айл о в ы й ввод -вывод в Windows. О то бражен ие файл о в на ад ре сн о е п ро стран ств о п ро грам м ы . Ф айл о в ы е системн ы е фун кцииWindows В оронеж 2004
Transcript
Page 1: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РФ В О РО Н Е Ж СК И Й Г О СУДА РСТ В Е Н Н Ы Й УН И В Е РСИ Т Е Т

П о собие п о сп е циал ь н о сти 071900 О П Д .Ф .11

О п е рацио н н ы е систе м ы

Ф айл о в ы й в в о д -в ы в о д в Windows. О то браж е н ие файл о в н а ад ре сн о е п ро стран ств о п ро грам мы .

Ф айл о в ы е систе м н ы е фун кции Windows

В оронеж 2004

Page 2: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

2

Утверж д ено научно-метод ическим советом Ф КН протокол № 2 от

10.12.2003. Составители:

В ахтин А . А ., Семенов С. В ., Беляев А . С.

Рецензент д оц. каф . ядерной ф изики К . С. Ры бак

П особие под готовлено на каф ед ре программирования и инф ормацион-

ных технологий ф акультета компью терных наук В оронежского госуд арст-венного университета. П ред назначено д ля студ ентов 3 курса д невного и вечернего отд елений .

Page 3: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

3

В вод -вы вод , визуальны е или не визуальны е объекты , сетевые ресурсы и многое д ругое непосредственно связано с ресурсами операционной систе-мы и д оступ к ним в язы ках программирования осущ ествляется с помощ ью станд артных средств. О д ним из основных станд артных и независимых от язы ка программирования средством пред оставления ресурсов и управления операционной системой Windows является библиотека WinAPI.

О сновным средством д оступа к ресурсам операционной системы Win-dows являю тся системны е объекты . Доступ к ним осущ ествляется с помо-щ ью уникального числа , которое назы ваю т д ескриптор (Handle), а управле-ние с помощ ью системных ф ункций (WinAPI-ф ункции).

В се описанны е в д анном пособии ф ункции наход ятся в библиотеке ker-nel32.dll.

П р имеч а ние В 16-разря д н ом Windows д е с крипт ором я вля лс я ад ре с в пам я т и, гд е хран илс я объект , н о в 32-разря д н ом Windows (Win 9x, NT, 2000, XP) д е с крипт ор объект а н икакой с вя зи с ад р е с ом в операт ивн ой пам я т и н е им е ет .

Ф а йло в ы е о б ъ ек ты в Windows Ф ай лы в операционной системе Windows использую тся как д ля д ли-

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

Для созд ания ф ай ловых объектов в операционной системе Windows ис-пользуется ф ункция

function CreateFile(lpFileName: PChar,

dwDesiredAccess: Cardinal, dwShareMode: Cardinal, lpSecurityAttributes: PSecurityAttributes, dwCreationDistribution: Cardinal, dwFlagsAndAttributes: Cardinal, hTemplateFile: Cardinal): THandle;

П араметры ф ункции: lpFileName – строка с ф изическим именем ф ай ла на д иске. dwDesiredAccess – опред еляет д оступ к д анны м в ф ай ле:

Page 4: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

4

0 – д анные ф ай ла нельзя ни прочитать, ни з аписать. И спользуется д ля получения д ескриптора ф ай ла , которы й используется, например, д ля з ад а-ния атрибутов ф ай ла;

GENERIC_READ – опред еляет д оступ к д анны м ф ай ла на чтение; GENERIC_WRITE – опред еляет д оступ к ф ай лу на запись д анных. П ослед ние д ве константы можно записать с помощ ью логического

сложения or: GENERIC_READ or GENERIC_WRITE – опред еляет д оступ к ф ай лу

как на чтение, так и на з апись; dwShareMode – опред еляет д оступ к д анны м откры ваемого или созд а-

ваемого ф ай ла д ругим приложениям: 0 – совместны й д оступ к д анны м з апрещ ен; FILE_SHARE_DELETE – ф ай л может бы ть уд ален, д аже если он ещ е

используется. Данны й параметр опред елен только д ля Windows на плат-ф орме NT;

FILE_SHARE_READ – откры т совместны й д оступ на чтение; FILE_SHARE_WRITE – открыт совместны й д оступ на з апись; Данны е константы можно з ад ать в качестве параметра в вид е комбина-

ции констант используя логическое сложение or: FILE_SHARE_READ or FILE_SHARE_WRITE – откры т совместны й

д оступ на чтение и запись. lpSecurityAttributes – ссы лка на структуру TSecurityAttributes, опред е-

ляю щ ую правила управления процессом ввод а-вы вод а д анных. Данны й па-раметр применяется край не ред ко и обы чно его зад аю т как nil, и он актуа-лен только д ля Windows на платф орме NT.

dwCreationDistribution – опред еляет откры вается ф ай л или созд ается новы й :

CREATE_NEW – созд ается новы й ф ай л. Е сли ф ай л сущ ествует, то ге-нерится ош ибка ;

CREATE_ALWAYS – созд ает ф ай л. Е сли ф ай л уже сущ ествует, то д ан-ные из старого ф ай ла уд аляю тся;

OPEN_EXISTING – откры вает сущ ествую щ ий ф ай л. Е сли ф ай л не су-щ ествует, то генерится ош ибка;

OPEN_ALAWS – откры вает сущ ествую щ ий ф ай л. Е сли ф ай л не сущ е-ствует, то созд ается новы й ;

TRUNCATE_EXISTING – открывает сущ ествую щ ий ф ай л и уд аляет все д анны е из него. Е сли ф ай л не сущ ествует, то генерится ош ибка;

Page 5: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

5

dwFlagsAndAttributes – опред еляю тся ф лаги и атрибуты ф ай ла, со-стоящ ие из комбинации констант:

FILE_ATTRIBUTE_ARCHIVE – архивны й ф ай л; FILE_ATTRIBUTE_HIDDEN – скрыты й ф ай л; FILE_ATTRIBUTE_NORMAL – станд артны й набор ф ай ловых атрибу-

тов. О бы чно не используется д ля комбинации констант аттрибутов; FILE_ATTRIBUTE_READONLY – ф ай л только д ля чтения; FILE_ATTRIBUTE_SYSTEM – системны й ф ай л; FILE_ATTRIBUTE_TEMPORARY – временны й ф ай л. О бы чно не ис-

пользуется; FILE_FLAG_WRITE_THROUGH – использовать кэ ш -буф ер д ля записи

д анных на д иск. Данны е сначала помещ аю тся в кэ ш -буф ер системы , а по-том постепенно з аписы ваю тся на д иск;

FILE_FLAG_OVERLAPPED – з ад ается д ля синхронизации од новре-менного чтения и записи в ф ай л разны ми программами. И спользуется ред -ко;

FILE_FLAG_NO_BUFFERING – не использовать кэ ш -буф ер. Работа с д анны ми в ф ай ле ведется напрямую ;

FILE_FLAG_RANDOM_ACCESS – д оступ к д анны м могут бы ть слу-чай ны м образом. И спользуется системой оптимизации кэ ш -буф ера;

FILE_FLAG_SEQUENTIAL_SCAN –д оступ к д анны м может быть по-след овательным. И спользуется системой оптимизации кэ ш -буф ера ;

FILE_FLAG_DELETE_ON_CLOSE – при закры тии ф ай ла объекта ф ай л д олжен бы ть уд ален. М ожет возникнуть критический сбой во время закры -тия ф ай лового объекта, если ф ай л имеет общ ий д оступ.

hTemplateFile – если параметр отличен от нуля, то ф ай ловы е аттрибуты

копирую тся из ф ай ла , с д ескриптором hTemplateFile. Ф ункция созд ает или откры вает ф ай л и возвращ ает д ескриптор ф ай ло-

вого объекта д ля д альней ш ей работы . В случае ош ибок во время работы ф ункция возвращ ает нулевой д ескриптор. К од ош ибки можно опред елить ф ункцией GetLastError.

П ри з аверш ении работы ф ай ловые объекты необход имо уд алить. Для э тих целей используется станд артная ф ункция

fnction CloseHandle(Handle: THandle): Boolean; П араметры ф ункции: Handle – д ескриптор объекта.

Page 6: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

6

П ри успеш ной работе ф ункция возвращ ает результат true. И наче – false. К од ош ибки можно опред елить ф ункцией GetLastError.

П р имеч а ние. В Delphi ре ализованы фун кции FileCreate и FileOpen

пре д н азн ачен ные д ля с озд ан ия н овых или от крыт ия с ущ е с т вующих н а д ис ке файлов и в каче с т ве результ ат ов пере д ачи файловый д е с крипт ор . Д ля закрыт ия файлового объе кт а ре ализован а фун кция FileClose.

Ф а йло в ы й в в о д-в ы в о д Для чтения д анных из ф ай лов используется ф ункция

function ReadFile(hFile: THandle; var lpBuffer: Pointer; nNumberOfBytesToRead: Cardinal; var lpNumberOfBytesRead: Cardinal; lpOverlapped: POverlapped): Boolean;

П араметры ф ункции: hFile – д ескриптор ф ай лового объекта . lpBufer – указатель на буф ер, куд а буд ут считаны д анны е. nNumberOfBytesToRead – размер считы ваемых д анных в бай тах. О бы ч-

но э то размер буф ера. lpNumberOfBytesRead – количество считанных бай т. lpOverlapped – указатель на структуру TOverlapped. И спользуется

только когд а при откры тии ф ай ла зад ан ф лаг FILE_FLAG_OVERLAPPED. О бы чно э тот параметр равен nil.

П ри успеш ном считы вании д анных ф ункция возвращ ает true. Е сли при

считы вании д остигнут конец ф ай ла или возникли сбои, ф ункция возвращ ает false. К од ош ибки можно получить ф ункцией GetLastError. Е сли д остигнут конец ф ай ла, GetLastError возвращ ает ERROR_HANDLE_EOF.

Запись д анных в ф ай л осущ ествляется ф ункцией function WriteFile(hFile: THandle;

lpBuffer: Pointer; nNumberOfBytesToWrite: Cardinal; var lpNumberOfBytesWritten: Cardinal; lpOverlapped: POverlapped): Boolean;

Page 7: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

7

П араметры ф ункции: hFile – д ескриптор ф ай лового объекта . lpBufer – указатель на буф ер д анных. nNumberOfBytesToWrite – число записы ваемых бай т. О бы чно э то раз-

мер буф ера. lpNumberOfBytesWritten – количество з аписанных бай т. lpOverlapped – указатель на структуру TOverlapped. И спользуется

только когд а при откры тии ф ай ла зад ан ф лаг FILE_FLAG_OVERLAPPED. О бы чно э тот параметр равен nil.

П ри успеш ной записи д анных ф ункция возвращ ает true. Е сли при запи-

си возникли какие-либо сбои, ф ункция возвращ ает false. К од ош ибки можно получить ф ункцией GetLastError.

П р имеч а ние. В Delphi реализованы фун кции FileRead и FileWrite д ля

чт е н ия и запис и д ан ных в файл, ан ологичных ReadFile и WriteFile. Для переход а в нужную позицию в ф ай ле используется ф ункция

function SetFilePointer(HFile: THandle; lDistanceToMove: Integer; var lpDistanceToMoveHigh: Integer; dwMoveMethod: Cardinal): Cardinal;

П араметры ф ункции: HFile – д ескриптор ф ай лового объекта. lDistanceToMove – млад ш ие 32 бита смещ ения в ф ай ле. lpDistanceToMoveHigh –старш ие 32 бита смещ ения в ф ай ле.

dwMoveMethod – указы вает, относительно чего смещ ение: FILE_BEGIN – от начала ф ай ла; FILE_CURRENT – с текущ ей позиции; FILE_END – от конца ф ай ла. П ри успеш ном вы полнении ф ункция возвращ ает 32 млад ш их бита

смещ ения и помещ ает старш ие 32 бита в lpDistanceToMoveHigh. В случае ош ибок ф ункция возвращ ает $FFFFFFFF. Для получения код а ош ибки ис-пользуй те GetLastError.

П р имеч а ние. В Delphi реализован а фун кция FileSeek ан алогичн ая

SetFilePointer.

Page 8: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

8

В ф ай ловом ввод е-вы вод е иногд а требуется убрать д анны е от з ад анной позиции д о конца ф ай ла. Для э тих целей используется ф ункция

function SetEndOfFile(HFile: THandle): Boolean;

П араметры ф ункции:

HFile – д ескриптор ф ай лового объекта. П ри успеш ной работе ф ункция уд аляет все д анны е с установленной

позиции д о конца ф ай ла и возвращ ает true. В случае ош ибки возвращ ается false, код ош ибки можно получить с помощ ью ф ункции GetLastError. Для установки текущ ей позиции используй те ф ункцию SetFilePointer.

У д алить полностью все д анны е из ф ай ла можно ф ункцией function FlushFileBuffers(HFile: THandle): Boolean; П араметры ф ункции: HFile – д ескриптор ф ай лового объекта. П ри успеш ной работе ф ункция уд аляет все д анны е из ф ай ла и возвра-

щ ает true. И наче – false. Для получения код а ош ибки используй те ф ункцию GetLastError.

П ример ф а йло в о го в в о да -в ы в о да В качестве примера ф ай лового ввод а-вы вод а рассмотрим программу-

текстовы й ред актор, в которой реализованы процед уры считы вания и запи-си д анных:

1. Чте н ие :

procedure TForm1.OpenClick(Sender: TObject); var HFile: THandle; n: Cardinal; ch: Char; Str: String; begin //открываем файл

Page 9: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

9

HFile:=CreateFile(OpenDialog1.FileName, GENERIC_READ, 0, nil, OPEN_EXISTING, 0,0); n:= GetLastError; if n<>0 then raise Exception.Create(‘Ошибка ввода-вывода ‘+IntToStr(n)); //считываем данные While ReadFile(HFile, @Ch, 1,n, nil) do if Ch=#13 then begin Memo1.Items.Add(Str); ReadFile(HFile, @Ch, 1,n, nil); end else Str:=Str+Ch; //закрываем файл CloseHandle(HFile); end;

2. Зап ись :

procedure TForm1.SaveClick(Sender: TObject); var HFile: THandle; n: Cardinal; i: Integer; Str: String; begin //открываем файл HFile:=CreateFile(SaveDialog1.FileName, GENERIC_WRITE, 0, nil, CREATE_ALAWS, 0,0); n:= GetLastError; if n<>0 then raise Exception.Create(‘Ошибка ввода-вывода ‘+IntToStr(n)); //записываем данные for i:=0 to Memo1.Items.Count-1 do begin Str:=Memo1.Items[i]+#13#10; if not WriteFile(HFile, @Str[1], Length(Str), n) then raise Exception.Create(‘Ошибка записи данных ’+IntToStr(GetLastError)); end; //закрываем файл CloseHandle(HFile); end;

Page 10: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

10

О то б ра ж ен ие ф а йло в н а а дресн о е про стра н ств о про гра м м ы

О тображение ф ай лов на ад ресное пространство программы в операци-онной системе Windows од на из наиболее часто используемых операций системы . В ы д еление виртуальной памяти д ля работы программы , загрузка д инамически компонуемых библиотек, временны е ф ай лы – э ти зад ачи не-посредственно несут з ад ачу отображения д анных, хранящ ихся в ф ай лах, на ад ресное пространство программы , реализованных в операционной системе или в приложении разработчиками.

Для отображения ф ай ла на ад ресное пространство необход имо созд ать ф ай ловы й объект (CreateFile), объект отображения ф ай ла с помощ ью ф унк-ции

function CreateFileMapping(HFile: THandle;

lpSecurityAttributes: PsecurityAttributes; flProtect: Cardinal; dwMaximumSizeHigh: Cardinal; dwMaximumSizeLow: Cardinal; lpName: PChar): THandle;

П араметры ф ункции: hFile – д ескриптор ф ай ловых ф ункций . lpSecurityAttributes – ссы лка на структуру TSecurityAttributes, опред е-

ляю щ ую правила управления процессом ввод а-вы вод а д анных. Данны й па-раметр применяется край не ред ко и обы чно его зад аю т как nil, и он актуа-лен только д ля Windows на платф орме NT.

flProtect – опред еляет д оступ к д анны м: PAGE_READONLY – д оступ к д анны м открывается только на чтение.

Ф ай ловы й объект (hFile) д олжен бы ть созд ан на чтение (GENERIC_READ); PAGE_READWRITE – д оступ к д анны м откры ваеnся на чтение и на за-

пись. Ф ай ловы й объект (hFile) д олжен бы ть созд ан на чтение и на запись (GENERIC_READ or GENERIC_WRITE);

PAGE_WRITECOPY – д оступ к д анны м откры вается на запись. Ф ай ло-вы й объект (hFile) д олжен бы ть созд ан на чтение и на запись (GENERIC_READ or GENERIC_WRITE).

Для оптимизации ввод а-вывод а д анных на ф изическом уровне, пере-

численны е параметры могут комбинировать со след ую щ ими параметрами (с помощ ью операции or):

SEC_COMMIT – д анные сначала хранятся в памяти и постепенно запи-сываю тся в ф ай л (используется по умолчанию );

Page 11: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

11

SEC_IMAGE – используется д ля отображения вы полнимых ф ай лов и программных пакетов. Н е совместим с д ругими аттрибутами;

SEC_NOCACHE – Для работы с д анны ми не используется кэ ш . Данные пиш утся напрямую в ф изическую область памяти. Н е совместим с SEC_RESERVE и SEC_COMMIT;

SEC_RESERVE – при получении ссылки на ад ресное пространство , в котором отображены д анны е ф ай ла, вы д еляется новое ад ресное простран-ство.

dwMaximumSizeHigh – Старш ие 32 бай та максимального размера вы -

д еляемой памяти д ля отображения ф ай ловых д анных. dwMaximumSizeLow – М лад ш ие 32 бай та максимального размера вы -

д еляемой памяти д ля отображения ф ай ловых д анных. Смещ ение обязатель-но д олжно бы ть кратны м числу бай т в од ной странице виртуальной памяти.

lpName – И мя объекта отображения. И спользуется д ля поиска объекта в операционной системе.

П ри успеш ной работе результатом ф ункции буд ет д ескриптор на объ-

ект отображения ф ай ла на ад ресное пространство программы , иначе – ну-левое значение. Для получения код а ош ибки используй те ф ункцию GetLas-tError.

П о окончании работы объект отображения ф ай ла на ад ресное про-странство необход имо уд алить ф ункцией CloseHandle.

Для получения ссы лки на д анны е ф ай ла, отображенные на ад ресное пространство программы , используется ф ункция

function MapViewOfFile(hFileMappingObject: THandle;

dwDesiredAccess: Cardinal; dwFileOffsetHigh: Cardinal; dwFileOffsetLow: Cardinal; dwNumberOfBytesToMap: Cardinal): Pointer;

П араметры ф ункции: hFileMappingObject – д ескриптор объекта отображения. dwDesiredAccess – опред еляет д оступ к д анны м: FILE_MAP_WRITE – откры т д оступ к д анным на чтение и запись.

О бъект отображения ф ай ла на ад ресное пространство д олжен бы ть созд ан с параметром PAGE_READWRITE;

FILE_MAP_READ – открыт д оступ к д анны м на чтение. О бъект ото-бражения ф ай ла на ад ресное пространство д олжен бы ть созд ан с парамет-ром PAGE_READWRITE или PAGE_READONLY;

Page 12: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

12

FILE_MAP_ALL_ACCESS – откры т д оступ на чтение и на запись. П а-раметр аналогичен FILE_MAP_WRITE.

dwFileOffsetHigh – старш ие 32 бита числа смещ ения от начала ф ай ла. dwFileOffsetLow – млад ш ие 32 бита числа смещ ения от начала ф ай ла. dwNumberOfBytesToMap – число бай т, которы е буд ут отображены .

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

например, значение ф ункции FPtr, а количество д анных Size бай т, то д ан-ные располагаю тся в ад ресном д иапазоне от FPtr д о FPtr+Size-1.

К ак известно, кажд ой программе, з апущ енной в операционной системе Windows, отвод ится виртуальное ад ресное пространство, размерность ко-торого больш е, чем ф изической оперативной памяти. Ч асть э того про-странства отвод ится д ля загрузки программы , под клю чаемых библиотек и ресурсов. О стальное используется д ля хранения значений переменных, в том числе и д ля отображения д анных на ад ресное пространство.

Л егко можно д огад аться, что ф ай лы больш их размеров не всегд а воз-можно отобразить на ад ресное пространство программы полностью . П о-э тому осущ ествляется д оступ не ко всем д анны м ф ай ла, а к некоторы м из них, послед овательно под груж ая и уд аляя по мере необход имости. Т акой процесс назы ваю т пос т ран ичный д ос т уп к д ан ным . О чень важно, чтобы смещ ение от начала ф ай ла, перед аваемое в процед уру MapViewOfFile в ка-частве параметров dwFileOffsetHigh и dwFileOffsetLow, бы ло кратным раз-меру страницы в бай тах. В зависимости от версии и настроек операционной системы Windows виртуальны е страницы имею т разную размерность и по-лучить д анную инф ормацию в программе можно с помощ ью WinAPI-ф ункции GetSystemInfo. Ф ункция возвращ ает в качестве параметра запись типа _SYSTEM_INFO, гд е в поле dwAllocationGranularity помещ ается раз-мер страницы в бай тах.

Для освобож д ения области памяти, вы д еленной ф ункцией MapViewOf-File, используется ф ункция

function UnmapViewOfFile(lpBaseAddress: Pointer): Boolean;

П араметры ф ункции: lpBaseAddress – указатель на первы й э лемент вы д еленной области па-

мяти. П ри успеш ной работе ф ункция возвращ ает true, иначе – false. К од

ош ибки можно получить ф ункцией GetLastError.

Page 13: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

13

П р имеч а ние. 1. Н е забывайт е ос вобож д ат ь выд е ле н н ую пам я т ь по окончан ии работ ы! В с ис т е м н ом програм м ирован ии ос н ован од ин глав-ный прин цип: взя л – полож и н а м е с т о.

2. В завис им ос т и от пос ле д оват ельн ос т и заполн е н ия пам я т и, очи-с т ка ос уще с т вля ет с я в обрат н ом поря д ке .

Эт и правила обе с печивают коррект н ос т ь работ ы и быс т род ейс т -вие програм м ы.

П ример о то б ра ж ен ия ф а йла н а а дресн о е про стра н ств о .

В качестве примера рассмотрим процед уру, в которой копируется ф ай л, имя корого записано в ESourceFile в ф ай л, записанны й в EDestina-tionFile. В о время копирования созд ается объект отображения ф ай ла на ад -ресное пространство программы и д анны е копирую тся постранично.

procedure TForm1.Button1Click(Sender: TObject); const Par: Int64=$100000000; var HSFile, HDFile: THandle; HSMap, HDMap: THandle; FSPtr, FDPtr: Pointer; LowSize, HighSize: Cardinal; CopySize: Cardinal; SSize,DSize: Int64; Info: _SYSTEM_INFO; begin //открываем файл источник HSFile:=0; HSFile:=CreateFile(PChar(ESourceFile.Text), GENERIC_READ,0,nil,OPEN_EXISTING,0,0); if GetLastError<>0 then raise Excep-tion.Create('Ошибка открытия файла "'+ESourceFile.Text+'"'); //определяем размер файла LowSize:=0; HighSize:=0; LowSize:=GetFileSize(HSFile,@HighSize); if LowSize=Cardinal(-1) then begin CloseHandle(HSFile);

Page 14: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

14

raise Exception.Create('Не возможно определить размер файла "'+ESourceFile.Text+'"'); end; SSize:=Par*HighSize+LowSize; //создаем объект отображения файла источника на ад-ресное пространство программы HSMap:=0; HSMap:=CreateFileMapping(HSFile,nil, PAGE_READONLY,HighSize,LowSize,nil); if HSMap=0 then begin CloseHandle(HSFile); raise Exception.Create('Не возможно создать объ-ект отображения файла "'+ESourceFile.Text+'"'); end; //открываем файл адресата HDFile:=0; HDFile:=CreateFile(PChar(EDestinationFile.Text), GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS, 0,HSFile); if HDFile=0 then begin CloseHandle(HSMap); CloseHandle(HSFile); raise Exception.Create('Ошибка открытия файла "'+EDestinationFile.Text+'"'); end; //создаем объект отображения файла адресата на ад-ресное пространство программы HDMap:=0; HDMap:=CreateFileMapping(HDFile,nil, PAGE_READWRITE,HighSize,LowSize,nil); if HDMap=0 then begin CloseHandle(HSMap); CloseHandle(HSFile); CloseHandle(HDFile); raise Exception.Create('Не возможно создать объ-ект отображения файла "'+EDestinationFile.Text+'"'); end; //определяем размер страницы виртуальной памяти FillChar(Info,SizeOf(Info),0); GetSystemInfo(Info); CopySize:=Info.dwAllocationGranularity;

Page 15: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

15

//копирование try DSize:=0; while SSize>DSize do if (SSize-DSize)>=CopySize then begin FSPtr:=nil; FSPtr:=MapViewOfFile(HSMap, FILE_MAP_READ,DSize div Par,DSize mod Par, CopySize); if FSPtr=nil then raise Exception.Create('Ошибка получения ссылки на данные файла "'+ESourceFile.Text+'"'); FDPtr:=nil; FDPtr:=MapViewOfFile(HDMap, FILE_MAP_WRITE,DSize div Par,DSize mod Par, CopySize); if FDPtr=nil then raise Exception.Create('Ошибка получения ссылки на данные файла "'+EDestinationFile.Text+'"'); CopyMemory(FDPtr,FSPtr,CopySize); DSize:=DSize+CopySize; if not UnmapViewOfFile(FSPtr) then raise Ex-ception.Create('Ошибка удаления ссылки на данные файла "'+ESourceFile.Text+'"'); if not UnmapViewOfFile(FDPtr) then raise Ex-ception.Create('Ошибка получения ссылки на данные файла "'+EDestinationFile.Text+'"'); end else begin FSPtr:=nil; FSPtr:=MapViewOfFile(HSMap, FILE_MAP_READ,DSize div Par,DSize mod Par,SSize-DSize); if FSPtr=nil then raise Excep-tion.Create('Ошибка получения ссылки на данные файла "'+ESourceFile.Text+'"'); FDPtr:=nil; FDPtr:=MapViewOfFile(HDMap, FILE_MAP_WRITE,DSize div Par,DSize mod Par,SSize-DSize); if FDPtr=nil then raise Excep-tion.Create('Ошибка получения ссылки на данные файла "'+EDestinationFile.Text+'"'); CopyMemory(FDPtr,FSPtr,SSize-DSize); DSize:=SSize;

Page 16: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

16

if not UnmapViewOfFile(FSPtr) then raise Exception.Create('Ошибка удаления ссылки на данные фай-ла "'+ESourceFile.Text+'"'); if not UnmapViewOfFile(FDPtr) then raise Exception.Create('Ошибка получения ссылки на данные файла "'+EDestinationFile.Text+'"'); End; Finally CloseHandle(HSMap); CloseHandle(HSFile); CloseHandle(HDMap); CloseHandle(HDFile); End; end;

За да чи В зад ачах 1 – 20 вы полнить указанны е д ей ствия используя станд арт-

ные ф ункции WinAPI ф ай лового ввод а-вы вод а и/или отображения ф ай лов в память. 1. Скопировать ф ай л в д ругой ф ай л с атрибутами только д ля чтения. 2. Созд ать (откры ть сущ ествую щ ий ) ф ай л и записать блок д анных в уста-новленную позицию .

3. П осимвольны м считы ванием ф ай ла опред елить, является ли он тексто-вы м или бинарны м.

4. Считать из од ного ф ай ла блок д анных с зад анной позиции и записать его в д ругой ф ай л.

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

6. В строках текстового ф ай ла уд алить зад анное количество символов с зад анной позиции.

7. В строках текстового ф ай ла уд алить символы , позиция которых превы -ш ает зад анную позицию .

8. П ереписать д анны е ф ай ла в обратном поряд ке (не используя рекурсию ). 9. О бъед инить несколько ф ай лов в од ин. 10. И меется несколько структурированных ф ай лов. О бъед инить их в од ин ф ай л с новой структурой (послед овательное расположение структур каж д ого из ф ай лов д руг з а д ругом). В объед иняемых ф ай лах пропускать нулевы е структуры (которы е состоят только из нулей ).

11. Сравнить д ва ф ай ла. 12. Сравнить д ва ф ай ла по смы словому сод ержанию , то есть расстояния меж д у словами и разд елителями не имею т значения, а сами слова счи-

Page 17: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

17

таю тся од инаковы ми, если состоят из од них и тех же букв (регистр иг-норируется).

13. Сравнить д ва текстовых ф ай ла и вывести в третий только те слова, ко-торы е не встречаю тся сразу в обоих ф ай лах.

14. П рочитать текстовы й ф ай л. В ывести инф ормацию о количестве слов, состоящ их из од ного, д вух символов и т.д .

15. П росмотреть текстовы й ф ай л либо отображая его символы , либо ш ест-над цатеричное пред ставление.

16. И меется текстовы й ф ай л сообщ ений (упоряд оченных по д ате). К аж д ая строка состоит из д аты и самого сообщ ения. В ы вести все сообщ ения з а указанны й период в новы й ф ай л.

17. И меется текстовы й ф ай л сведений о студ ентах (не упоряд оченны й по д ате). К аж д ая строка состоит из д аты рож д ения и ф амилии студ ента. В ы вести список студ ентов, у которых д ень рож д ения совпад ает с теку-щ ей д атой .

18. И з зад анного структурного ф ай ла , в котором хранится инф ормация о товарах (наименование, цена , количество), вывести в д ругой ф ай л на-именования товаров в текстовы й ф ай л.

19. П рочитать текстовы й ф ай л, в котором хранится статья уголовного ко-д екса . В ы д елить из нее пункты д ля отд ельного просмотра, если извест-но, что признаком начала пункта является пред ложение, состоящ ее из номера пункта с точкой .

20. И звестен размер блока д анных структурированного ф ай ла. У д алить блоки, сод ержащ ие только нули.

Ф а йло в ы е систем н ы е ф ун к ции Windows П оиск, уд аление, копирование, з ад ание атрибутов ф ай лов – э то опера-

ции, которые д оступны через ф ункции WinAPI. Рассмотрим ф ункции д ля получения и ред актирования инф ормации о

ф ай ле: размер, атрибуты , д ата созд ания ф ай ла и послед него обновления. П олучить размер ф ай ла в бай тах можно с помощ ью ф ункции function GetFileSize(HFile: THandle;

var lpFileSizeHigh: Cardinal): Cardinal; П араметры ф ункции: HFile – д ескриптор ф ай лового объекта. lpFileSizeHigh – старш ие 32 бита размера ф ай ла. П ри успеш ной работе ф ункция возвращ ает млад ш ие 32 бита размерно-

сти ф ай ла и, если размер ф ай ла больш е 4 Г бай т, в переменную

Page 18: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

18

lpFileSizeHigh записы ваю тся старш ие 32 бита размерности ф ай ла. В случае ош ибки ф ункция возвращ ает $FFFFFFFF. П олучить код ош ибки можно с помощ ью ф ункции GetLastError.

Для получения атрибутов ф ай ла используется ф ункция function GetFileAttributes(FileName: PChar): Cardinal; П араметры ф ункции: FileName – имя ф ай ла. В случае ош ибки ф ункция возвращ ает $FFFFFFFF, д ля получения код а

ош ибки используй те ф ункцию GetLastError. П ри успеш ной работе ф ункция возвращ ает четы рехбай товое число, биты которого опред еляю т атрибуты ф ай ла:

FILE_ATTRIBUTE_READONLY – только д ля чтения. FILE_ATTRIBUTE_HIDDEN – скры ты й ; FILE_ATTRIBUTE_SYSTEM – ф ай л или д иректория системная. FILE_ATTRIBUTE_DIRECTORY – ф ай л является д иректорией ; FILE_ATTRIBUTE_ARCHIVE – архивны й ; FILE_ATTRIBUTE_NORMAL – ф ай л или д иректория имеет стан-

д артны е аттрибуты . FILE_ATTRIBUTE_TEMPORARY – ф ай л или д иректория временная. FILE_ATTRIBUTE_COMPRESSED – сжаты й ; FILE_ATTRIBUTE_OFFLINE – д анны е ф ай ла ф изически отсутствую т

и на д иске д оступен его ярлы к. К ак бы ло уже сказано, ф ункция возвращ ает число, у которого установ-

лены биты соответствую щ их атрибутов. Т ак, например, атрибуты скры той системной папки в д воичном вид е буд ет пред ставлено в вид е: 10110 (10000 – папка, 100 – системная, 10 – скрытая). Сущ ествует множество способов опред еления атрибутов. Н апример, пусть ф ункция GetFileAttributes вернула значение Attr чтобы опред елить наличие атрибута FILE_ATTRIBUTE_XXX д остаточно выполнить логическое умножение Attr and FILE_ATTRIBUTE_XXX, результатом которого буд ет FILE_ATTRIBUTE_XXX или, если этого атрибута не сущ ествует, нулевое значение.

Чтобы зад ать атрибуты ф ай ла используется ф ункция function SetFileAttributes(FileName: PChar;

FileAttributes: Cardinal): Boolean; П араметры ф ункции:

Page 19: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

19

FileName – имя ф ай ла. FileAttributes – Четы рехбай товое число, биты которого опред еляю т ат-

рибуты ф ай ла, описанны е вы ш е. П араметр можно зад ать с помощ ью логиче-ского сложения (or) перечисленных вы ш е констант (см. GetFileAttributes).

П ри успеш ной работе ф ункция возвращ ает true, иначе – false. Код

ош ибки можно получить ф ункцией GetLastError. И мея ф ай ловы й д ескриптор, можно получить время созд ания ф ай ла,

время послед него открытия и изменения ф ункцией function GetFileTime(HFile: THandle;

var CreationTime: TFileTime; var LastAccessTime: TFileTime; var LastWriteTime: TFileTime): Boolean;

П араметры ф ункции: HFile – д ескриптор ф ай лового объекта, которы й д олжен бы ть созд ан с

параметром GENERIC_READ. CreationTime – время созд ания ф ай ла. LastAccessTime – время послед него д оступа к ф ай лу. LastWriteTime – время послед него изменения ф ай ла. П ри сбое ф ункция возвращ ает false, получить код ош ибки можно ф унк-

цией GetLastError. П ри успеш ной работе ф ункция возвращ ает true, и в пара-метры CreationTime, LastAccessTime, LastWriteTime ввод ится соответст-вую щ ая инф ормация:

TFileTime=record dwLowDateTime: Cardinal; {м лад шие разря д ы 64-разря д н ого чис ла

опре д еля ющего д ат у и вре м я } dwHighDateTime: Cardinal; {с т аршие разря ды 64-разря д н ого чис ла

опре д еля ющего д ат у и вре м я } end; Е сли какая-либо инф ормация (CreationTime,

LastAccessTime, LastWriteTime) не под д ерживается Windows, то в соответствую щ их параметрах возвращ ается нуль.

Для того чтобы зад ать д ату и время созд ания, послед него д оступа и из-менения, используется ф ункция

Page 20: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

20

function SetFileTime(HFile: THandle; var CreationTime: TfileTime; var LastAccessTime: TFileTime; var LastWriteTime: TFileTime): Boolean;

П араметры ф ункции: HFile – д ескриптор ф ай лового объекта, которы й д олжен бы ть созд ан с

параметром GENERIC_WRITE. CreationTime – время созд ания ф ай ла. LastAccessTime – время послед него д оступа к ф ай лу. LastWriteTime – время послед него изменения ф ай ла. П ри сбое ф ункция возвращ ает false, получить код ош ибки можно ф унк-

цией GetLastError. П ри успеш ной работе ф ункция возвращ ает true. Е сли ка-кие-либо параметры (CreationTime, LastAccessTime, LastWriteTime) не зад а-ю тся, то в качестве параметра перед ается нулевое значение.

TFileTime – 64-разряд ное число, в которой хранится инф ормация о д ате и времени в код ированном вид е. Для того, чтобы получить д анную инф ор-мацию в д оступном д ля наш его понимания вид е, используется ф ункция

function FileTimeToSystemTime(const FileTime: TFileTime;

var SystemTime: TSystemTime): Boolean; П араметры ф ункции: FileTime – 64-разряд ное число с д анны ми о д ате и времени. SystemTime – конвертированны е д анны е о д ате и времени. В случае ош ибки ф ункция возвращ ает false, получить код ош ибки мож -

но ф ункцией GetLastError. П ри успеш ной работе ф ункция возвращ ает true и в параметр SystemTime ввод ится конвертированная инф ормация о д ате и времени:

TSystemTime=record wYear: Word; {год } wMonth: Word; {м е с я ц} wDayOfWeek: Word; {д е нь н е д ели} wDay: Word; {чис ло м е с я ца} wHour: Word; {час } wMinute: Word; wSecond: Word; wMilliseconds: Word;

Page 21: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

21

end; Для обратного конвертирования используется ф ункция

function SystemTimeToFileTime( const SystemTime: TSystemTime; var FileTime: TFileTime): Boolean;

П араметры ф ункции: SystemTime – д анны е о д ате и времени (см. FileTimeToSystemTime). FileTime – конвертированное 64-разряд ное число с д анны ми о д ате и

времени (см. GetFileTime). П ри успеш ном вы полнении ф ункция возвращ ает true, при ош ибке во

время вы полнения ф ункция возвращ ает false. П олучить код ош ибки можно ф ункцией GetLastError.

П олучить полную инф ормацию о ф ай ле с помощ ью ф ункции function GetFileInformationByHandle(HFile: THandle; var FileInformation:

TByHandleFileInformation): Boolean; П араметры ф ункции: HFile – д ескриптор ф ай лового объекта. FileInformation – возвращ аемая структура с инф ормацией о ф ай ле. В случае ош ибки ф ункция возвращ ает false, получить ош ибку можно

ф ункцией GetLastError. П ри успеш ной работе ф ункция возвращ ает true и в параметр FileInformation вносится инф ормация о ф ай ле:

TByHandleFileInformation=Record dwFileAttributes: Cardinal; {ат рибут ы файла (с м . GetFileAttributes и

SetFileAttributes} ftCreationTime: TFileTime; {вре м я с озд ан ия файла. См . GetFileTime} ftLastAccessTime: TFileTime; {вре м я пос ле д н е го д ос т упа к файлу.

См . GetFileTime } ftLastWriteTime: TFileTime; {вре м я пос ле д н е го изм е н е н ия файла. См .

GetFileTime } dwVolumeSerialNumber: Cardinal; {опре д еля ет с е рийный н ом е р ус т -

ройс т ва, н а кот ором хран ит с я файл} nFileSizeHigh: Cardinal; {с т аршие бит ы 64-бит н ого чис ла, опре д е -

ля юще го разм ер файла в байт ах}

Page 22: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

22

nFileSizeLow: Cardinal; {м лад шие биты 64-бит н ого чис ла, опре д е -ля юще го разм ер файла в байт ах}

nNumberOfLinks: Cardinal; {поря д ковый н ом ер-с сылка н а файл. Ак-т уальн о в файловой с ис т е м е NTFS. В FAT32 возвращ ае м ое значен ие вс е -гд а равн о 1}

nFileIndexHigh: Cardinal; {с т аршие бит ы 64-бит н ого чис ла, опр е д е -ля юще го ин д екс файла в с ис т е м е}

nFileIndexLow: Cardinal; {м лад шие биты 64-бит н ого чис ла, опре д е -ля юще го ин д екс файла в с ис т е м е . Д ан ный ин д екс ус т ан авливает с я файлу при с т арт е и н е изм е н я ет с я д о пе резагрузки опе рацион н ой с ис т е м ы}

end; Для копирования ф ай лов в библиотеке WinAPI реализована ф ункция

function CopyFile(lpExistingFileName: PChar; lpNewFileName: PChar; bFailIfExists: Boolean): Boolean;

П араметры ф ункции: lpExistingFileName – имя ф ай ла источника . lpNewFileName – имя нового ф ай ла . bFailIfExists – параметр, отвечаю щ ий за повед ение ф ункции в случае,

когд а ф ай л с именем lpNewFileName уже сущ ествует. Е сли он имеет значе-ние true и ф ай л lpNewFileName сущ ествует, ф ункция сгенерит ош ибку и возвратит false. И наче сущ ествую щ ий ф ай л буд ет перезаписан.

П ри успеш ной работе возвращ аемое значение ф ункции буд ет true.

И наче – false. П олучить код ош ибки можно ф ункцией GetLastError. П ри ко-пировании новому ф ай лу перед аю тся аттрибуты ф ай ла-источника.

Для уд аления сущ ествую щ его ф ай ла используется ф ункция function DeleteFile(lpFileName: PChar): Boolean; П араметры ф ункции:

lpFileName – имя уд аляемого ф ай ла П ри уд ачном з аверш ении операции буд ет возвращ ено true. В случае

сбоя, например, ф ай ла не сущ ествует, возвращ ается false. К од ош ибки мож -но получить с помощ ью ф ункции GetLastError.

Page 23: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

23

В ранних версиях Windows (3.11, 95) перемещ ение ф ай лов осущ ествля-лось копированием в од но место и уд алением с д ругого. В современных версиях д анной операционной системы если перемещ ается ф ай л с од ной папки в д ругую на од ном инф ормационном носителе, то ф ай л ф изически не переписы вается, а меняется инф ормация о сод ержании д анных в папках. П оэ тому д анны й процесс стал в несколько раз бы стрее. Для переноса ф ай ла используется ф ункция

function MoveFile(lpExistingFileName: PChar;

lpNewFileName: PChar): Boolean; П араметры ф ункции: lpExistingFileName – имя перемещ аемого ф ай ла. lpNewFileName – имя нового ф ай ла. П ри уд ачном вы полнении ф ункция возвращ ает true, иначе – false. К од

ош ибки можно получить ф ункцией GetLastError. Е щ е од ним важны м д ей ствием по работе с ф ай лами в операционной

системе Windows является поиск ф ай лов по маске. И нициализация поиска ф ай лов осущ ествляется ф ункцией

function FindFirstFile(FileName: PChar;

var FindFileData: TWin32FindData): THandle; П араметры ф ункции: FileName – имя искомого ф ай ла. В качестве имени может быть исполь-

зована маска, состоящ ая из набора символов, сод ержащ ихся в имени ф ай ла и спецсимволов: ‘*’ – в д анной позиции может стоять ни од ного, од ин или несколько символов, ‘?’ – в д анной позиции стоит од ин лю бой символ. Н а-пример, д ля поиска всех ф ай лов в папке c:\common используется маска ‘c:\common\*.*’, д ля поиска в д анной папке временных ф ай лов Delphi ис-пользуется маска ‘c:\common\*.~*’.

FindFileData – возвращ аемая инф ормация о най д енном ф ай ле. В случае ош ибки ф ункция возвращ ает $FFFFFFFF, д ля получения код а

ош ибки используй те GetLastError. П ри успеш ной работе ф ункция возвра-щ ает д ескриптор объекта поиска ф ай ла д ля д альней ш его использования ф ункцией FindNextFile и в параметр FindFileData помещ ается инф ормация о первом най д енном ф ай ле:

TWin32FindData=record

Page 24: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

24

dwFileAttributes: DWORD; {ат рибут ы файла с м . GetFileAttributes и SetFileAttributes}

ftCreationTime: TFileTime; {вре м я с озд ан ия файла. См . GetFileInfor-mationByHandle}

ftLastAccessTime: TFileTime; {вре м я пос ле д н е го д ос т упа к файлу. См . GetFileInformationByHandle}

ftLastWriteTime: TFileTime; {вр е м я пос ле д н е го изм е н е н ия файла. См . GetFileInformationByHandle}

nFileSizeHigh: DWORD; {с т аршие биты 64-разря д н ого чис ла, опре -д еля ющ его разм е р файла}

nFileSizeLow: DWORD; {м лад шие бит ы 64-разря д н ого чис ла, опре -д еля ющ его разм е р файла}

dwReserved0: DWORD; {н е ис пользует с я } dwReserved1: DWORD; {н е ис пользует с я } cFileName: array[0..255] of AnsiChar; {полный пут ь и им я файла} cAlternateFileName: array[0..13] of AnsiChar; {им я файла} end; П ри поиске группы ф ай лов по маске, зад аваемой в качестве параметра

ф ункции FindFirstFile, созд ается объект поиска , д ескриптор которой ис-пользуется д ля д альней ш его поиска с помощ ью ф ункции

function FindNextFile(HFindFile: THandle;

var FindFileData: TWin32FindData): Boolean; П араметры ф ункции: HFindFile – д ескриптор объекта поиска. FindFileData – возвращ аемая инф ормация о най д енном ф ай ле. Е сли ф ай л най д ен и в ф ункции не возникли ош ибки, возвращ ается зна-

чение true, и в параметр FindFileData ввод ится инф ормация о най д енном ф ай ле (см. FindFirstFile). В случае сбоев ф ункция возвращ ает false. К од ош ибки можно получить ф ункцией GetLastError. Е сли ф ай л не най д ен, то GetLastError возвращ ает ERROR_NO_MORE_FILES.

П о заверш ении поиска необход имо уд алить объект поиска ф ай ла ф ункцией

function FindClose(HFindFile: THandle): Boolean; П араметры ф ункции: HFindFile – д ескриптор объекта поиска.

Page 25: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

25

П ри успеш ной работе ф ункция возвращ ает true, в случае ош ибки ф унк-

ция возвращ ает false. П олучить код ош ибки можно ф ункцией GetLastError. П р имеч а ние. В Delphi реализованы wrapping-фун кции FindFirst,

FindNext ан алогичные FindFirstFile и FindNextFile. Для опред еления логических устрой ств, под клю ченных в системе, ис-

пользую тся ф ункция function GetLogicalDrives: Cardinal; Ф ункция возвращ ает 32-разряд ное число, биты которых показы ваю т

присутствую щ ие логические устрой ства. Н апример, пусть в системе под -клю чены д иски A, C, D, G, I, Z, тогд а возвращ аемое ф ункцией значение в д воичном вид е буд ет 10000000000000000101001101. В случае сбоев ф унк-ция возвращ ает нулевое значение. Для получения код а ош ибки используй те ф ункцию GetLastError.

Сущ ествует ещ е од на ф ункция, аналогичная ф ункции GetLogicalDrives, но возвращ аю щ ая д анны е о логических устрой ствах в вид е строк:

function GetLogicalDriveStrings(BufferLength: Cardinal;

Buffer: PChar): Cardinal; П араметры ф ункции: BufferLength – максимальны й размер буф ера (Buffer). Buffer – вы д еленная область памяти, в которую буд ет введена инф ор-

мация. Е сли при работе в ф ункции возникли сбои, то возвращ ается нулевое

значение, код ош ибки можно получить ф ункцией GetLastError. П ри успеш -ной работе в Buffer ввод ится соответствую щ ая инф ормация и ф ункция воз-вращ ает число записанных д анных в Buffer. Н апример, пусть в системе под -клю чены д иски A, C, D, тогд а в буф ер буд ет введена след ую щ ая инф орма-ция: ‘A:\’#0’C:\’#0’D:\’#0#0.

П омимо ф ункций д ля работы с ф ай лами и логическими устрой ствами в библиотеке WinAPI опред елены ф ункции д ля работы с д иректориями.

Для того, чтобы созд ать новы й каталог, используется ф ункция

function CreateDirectory(PathName: PChar; SecurityAttributes: PSecurityAttributes): Boolean;

Page 26: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

26

П араметры ф ункции: PathName – имя папки. SecurityAttributes – ссы лка на структуру TSecurityAttributes, опред е-

ляю щ ую правила управления процессом ввод а-вы вод а д анных. Данны й па-раметр применяется край не ред ко и обы чно его зад аю т как nil, и он актуа-лен только д ля Windows на платф орме NT.

П ри успеш ной работе ф ункция возвращ ает true, в случае ош ибок во

время вы полнения возвращ ается false. Для получения код а ош ибки исполь-зуй те GetLastError.

У д аление сущ ествую щ ей пустой д иректории осущ ествляется ф ункцией function RemoveDirectory(PathName: PChar): Boolean; П араметры ф ункции: PathName – имя уд аляемой д иректории. П ри успеш ной работе ф ункция возвращ ает true, в случае ош ибок во

время вы полнения возвращ ается false. Для получения код а ош ибки исполь-зуй те GetLastError.

Н еред ко при работе с ф ай ловы ми ф ункциями полны й путь не указы ва-ется, а указы вается имя ф ай ла или путь д о ф ай ла с текущ ей д иректории. И мя текущ ей д иректории автоматически устанавливается системой (напри-мер, д иректория, из которой з апущ ена программа), также можно зад ать те-кущ ую д иректорию ф ункцией

function SetCurrentDirectory(DirectoryName: PChar):

Boolean; П араметры ф ункции: DirectoryName – имя устанавливаемой д иректории. Е сли ф ункция отработала успеш но, то возвращ ается true, иначе – false.

К од ош ибки можно получить ф ункцией GetLastError. П олучить имя текущ ей д иректории можно ф ункцией

function GetCurrentDirectory(BufferLength: Cardinal; Buffer: PChar): Cardinal;

П араметры ф ункции:

Page 27: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

27

BufferLength – размер буф ера. Buffer – строка , в которую буд ет введено имя текущ ей д иректории. Е сли ф ункция отработала успеш но, то возвращ ается д линна строки, за-

писанной в Buffer. В случае ош ибок ф ункция возвращ ает нулевое значение. Для получения код а ош ибки используй те GetLastError.

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

В некоторых случая требуется получить имя папки, в которой наход ят-ся ф ай лы , основны е д рай веры и библиотеки операционной системы Win-dows. Н апример, д ля установки какой -либо системной программы .

П олучить имя временной папки можно с помощ ью ф ункции function GetTempPath(BufferLength: Cardinal;

Buffer: PChar): Cardinal; Для получения названия папки Windows используется ф ункция function GetWindowsPath(BufferLength: Cardinal;

Buffer: PChar): Cardinal; П олучить название системной папки можно с помощ ью ф ункции function GetSystemPath(BufferLength: Cardinal;

Buffer: PChar): Cardinal; П араметры д анных ф ункций и принцип работы аналогичен ф ункции

GetCurrentDirectory. И ногд а , например, в программах-инсталляторах, требуется знать сво-

бод ное пространство на д иске. Для э тих целей используется ф ункция

function GetDiskFreeSpaceEx(DirectoryName: PChar; var FreeBytesAvailableToCaller: PLargeInteger, var TotalNumberOfBytes: PLargeInteger; var TotalNumberOfFreeBytes: PLargeInteger): Boolean;

П араметры ф ункции:

Page 28: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

28

DirectoryName – имя д иска. FreeBytesAvailableToCaller – объем свобод ного пространства на д иске

в бай тах, д оступного текущ ему пользователю . TotalNumberOfBytes – общ ий объем д иска в бай тах. TotalNumberOfFreeBytes – общ ий объем свобод ного пространства на

д иске в бай тах. PLargeInteger=^Int64;//64-разря д н ое целое чис ло П ри успеш ной работе ф ункция возвращ ает true и в параметры ввод ится

соответствую щ ая инф ормация. В случае ош ибок ф ункция возвращ ает false. Для получения код а ош ибки используй те GetLastError.

П р имеч а ние. В ран н их верс ия х 16-разря д н ого Windows ис пользовалась

фун кция GetDiskFreeSpace, кот орая работ ает н а д ис ках объе м ом н е бо-лее 4 гигабайт .

Для получения полной инф ормации о системных ф ай лах и объеме д ис-

ка используется ф ункция

function GetVolumeInformation(RootPathName: PChar; VolumeNameBuffer: PChar; VolumeNameSize: Cardinal; var VolumeSerialNumber: Cardinal; var MaximumComponentLength: Cardinal; var FileSystemFlags: Cardinal; FileSystemNameBuffer: PChar; FileSystemNameSize: Cardinal): Boolean;

П араметры ф ункции: RootPathName – И мя д иска. Это может бы ть имя д иректории, наход я-

щ аей ся на уд аленном компью тере. VolumeNameBuffer – буф ер, в которы й буд ет внесено имя устрой ства . VolumeNameSize – размер буф ера VolumeNameBuffer. VolumeSerialNumber – серий ны й номер д иска. MaximumComponentLength – максимальная д лина имени ф ай ла, под -

д ерживаемая ф ай ловой и операционной системой . FileSystemFlags – комбинация ф лагов, опред еляю щ их параметры ф ай -

ловой и операционной системы : FS_CASE_IS_PRESERVED –на д анном д иске хранятся системные

ф ай лы .

Page 29: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

29

FS_CASE_SENSITIVE – под д ерживаю тся д линны е имена ф ай лов. FS_UNICODE_STORED_ON_DISK – имена ф ай лов хранятся в код и-

ровке Unicode. FS_PERSISTENT_ACLS – ф ай ловой системой под д ерживается ACLS-

технология. Н апример, д анная технология под д ерживается в NTFS. FS_FILE_COMPRESSION – используется ф ай ловое сжатие. FS_VOL_IS_COMPRESSED – ф ункцией возвращ ается объем д анных в

сжатом вид е. FILE_NAMED_STREAMS – д исковое пространство под елено межд у

д оменами. FILE_READ_ONLY_VOLUME – д иск д оступен только д ля чтения. FILE_SUPPORTS_ENCRYPTION – под д ерживается технология EFS. FILE_SUPPORTS_OBJECT_IDS – под д ерживается технология IDS. FILE_SUPPORTS_REPARSE_POINTS – под д ерживается технология

восстановления уд аленных ф ай лов. FILE_SUPPORTS_SPARSE_FILES – ф ай лы на д иске ф рагментированы .

FILE_VOLUME_QUOTAS – д ля д оменов зад ана квота на максимальны й объем хранимой инф ормации.

FileSystemNameBuffer – буф ер, в которы й буд ет внесено имя системной

папки. FileSystemNameSize – размер буф ера FileSystemNameBuffer. П ри успеш ной работе ф ункция возвращ ает true и соответствую щ ую

инф ормацию в параметрах. И наче – false. Для получения код а ош ибки ис-пользуй те ф ункцию GetLastError.

О писанны е вы ш е ф ай ловы е системные WinAPI-ф ункции являю тся станд артны ми ф ункциями и наход ятся в библиотеке kernel32.dll. В совре-менной операционной системе были разработаны новы е ф ункции служеб-ные ф ункции, которые назы ваю тся *ShellAPI-ф ункциями.

П р имеч а ние. В Delphi WinAPI-фун кции им порт ированы в м од уле

Windows, ShellAPI-фун кции – в м од уле ShellAPI. Для того чтобы откры ть ф ай л в соответствую щ ем приложении или

распечатать текстовы й д окумент, используется ф ункция function ShellExecute(hwnd: THandle;

lpOperation: PChar; lpFile: PChar; lpParameters: PСhar;

* Shell – пер. с англ. оболочка

Page 30: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

30

lpDirectory: PChar; nShowCmd: integer): THandle;

П араметры ф ункции: hwnd – д ескриптор род ительского окна . lpOperation – строка с вы полняемой операцией :

"open" – открывает ф ай л. Загруж ается приложение, связанное с д анны м ф ай лом.

"print" – печатает ф ай л. Ф ай л д олжен бы ть д окументом. Е сли пе-ред ано приложение, то вы полняю тся д ей ствия, аналогичны е "open".

"explore" – откры вает папку в провод нике Windows. nil – аналогично "open".

lpFile – И мя ф ай ла или каталога. lpParameters – параметры приложения. lpDirectory – имя текущ ей д иректории д ля откры ваемого приложения.

Е сли параметр равен nil, то используется текущ ая д иректория, в которой наход ится ф ай л.

nShowCmd – параметр, опред еляю щ ий вид окна запущ енного прило-жения:

SW_HIDE – скры вает окно. П риложение з апущ ено, но на э кране его не вид но.

SW_MAXIMIZE – разворачивает окно приложения на весь э кран. SW_MINIMIZE – сворачивает окно приложения в иконку на панели за-

д ач. SW_SHOWMAXIMIZED – разворачивает окно приложения и д елает

его активным. SW_SHOWMINIMIZED – сворачивает окно приложения и д елает его

активны м. SW_SHOWNORMAL – активизирует окно приложения с установлен-

ными в программе параметрами окна. П ри успеш ной работе ф ункция возвращ ает д ескриптор з апущ енного

приложения. В случае ош ибок возвращ ается нулевой д ескриптор. П олучить код ош ибки можно ф ункцией GetLastError.

За да чи н а систем н ы е ф ун к ции 1. В ывести список ф ай лов в зад анном каталоге в поряд ке убы вания размера ф ай лов.

2. В ывести список всех скры тых каталогов из зад анной папки.

Page 31: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

31

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

4. Для всех ф ай лов из зад анного каталога д обавить атрибут «скрыты й » , ес-ли ф ай л только д ля чтения, и сбросить ф лаг «архивны й » в обратном слу-чае.

5. В ывести имя ф ай ла из зад анного каталога с самой ранней д атой созд а-ния.

6. В сем ф ай лам из з ад анного каталога, которы е были созд аны нед елю назад или ранее, установить текущ ую д ату.

7. И з зад анной папки скопировать ф ай лы с опред еленны ми атрибутами в д ругую папку.

8. В зад анной папке уд алить ф ай лы , созд анны е ранее опред еленной д аты , остальны е переименовать, д обавив к имени текущ ую д ату.

9. В ывести список всех логических д исков и их общ ий объем и объем сво-бод ного пространства. О пред елить, д оступен ли д иск д ля записи.

10. В ы вести имена и размер всех ф ай лов из зад анного каталога . 11. И з зад анного каталога вы вести имена всех под каталогов, не сод ержа-щ их в себе ф ай лов.

12. В ы вести полны й путь к временной папке (GetTempPath) и уд алить из нее все ф ай лы с зад анным расш ирением.

13. Рекурсивно уд алить все пусты е вложенные под каталоги з ад анного ката-лога .

14. П о маске рекурсивно уд алить все ф ай лы из всех под каталогов з ад анного каталога.

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

16. Н аписать навигатор по ф ай ловой системе с возможностью откры тия, просмотра и изменения имени и атрибутов ф ай ла (каталога).

17. Н аписать программу поиска ф ай ла по маске, д ате созд ания, послед нему времени д оступа, размеру, атрибутам.

Page 32: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

32

Литера тура : 1. А рхангельский А . Я . П рограммирование в Delphi 6./ А . Я . А рхангельский . – М .: ЗА О «И зд ательство БИ Н О М » , 2002 – 1120 с.

2. В ерма Р. Д . Справочник по ф ункциям Win32 API./ Р. Д . В ерма . – М .: И з-во «Г орячая линия – телеком, Рад ио и связь» , 2002 – 488 с.

3. Г анеев Р. М . П роектирование интерф ей са пользователя средствами Win32 API./ Р. Д . В ерма. – М .: И з-во «Г орячая линия – телеком» , 2001 – 336 с.

4. Н еббет Г . Справочник по базовы м ф ункциям API Windows NT/2000./ Г . Неббет. – Спб.: И зд ательский д ом «В ильямс» , 2002 – 528 с.

5. Румянцев П . В . А збука программирования в Win32 API (3-е изд ание)./ П . В . Румянцев. – М .: И з -во «Г орячая линия – телеком» , 2001 – 312 с.

6. Сай мон Р. Windows 2000 API. Энциклопед ия программиста ./ Р. Сай мон. – Спб.: «Диасоф т» , 2002 – 1088 с.

7. Т ей ксей ра С. Delphi 4. Руковод ство разработчика./ С. Т ей ксей ра, К . П аче-ко: пер. с англ. – Спб.: И зд ательский д ом «В ильямс» , 1999. – 912 с.

8. Х арт Дж . Системное программирование в среде Win32./ Дж . Х арт. – Спб.: И з д ательский д ом «В ильямс» , 2001 – 463 с.

Page 33: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

33

Ссы лк и в Internet: 1. К оролевство Delphi. В иртуальны й клуб программистов

http://www.delphikingdom.ru/ 2. Краткий справочник по Win32 API в ф оруме д ля программистов

http://www.vcl.ru/html/cb/faq/api.html. 3. Сборник статей и мало д окументированных возможностей программиро-вания в Delphi под Windows http://delphiworld.narod.ru

4. Сорока Т . В опросы программирования под Windows http://www.bcbdev.ru.

5. Справочник по Win32 API на русском http://www.firststeps.ru/mfc/winapi/index.html

6. Справочник по Win32 API с примерами использования http://doc.mpv.ru/steps/mfc/winapi/winapi1.html

7. Статьи по программированию http://www.wasm.ru 8. Т ехнологии программирования http://www.HiProg.com 9. Электронны е книги и учебники по программированию

http://www.cnt.ru/~wh/x/books_n_manuals.html 10. Электронны е книги по Win32 API

http://anatolix.naumen.ru/win32books.htm 11. MSDN Library. Microsoft Corporation

http://msdn.microsoft.com/library/en-us/fileio/base/file_management_ functions.asp

Page 34: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

34

С о держ а н ие Ф ай ловы е объекты в Windows............................................................................. 3 Ф ай ловы й ввод -вы вод ........................................................................................... 6 П ример ф ай лового ввод а-вы вод а........................................................................ 8 О тображение ф ай лов на ад ресное пространство программы ..................... 10 П ример отображения ф ай ла на ад ресное пространство . ............................. 13 Зад ачи.................................................................................................................... 16 Ф ай ловы е системные ф ункции Windows ......................................................... 17 Зад ачи на системны е ф ункции .......................................................................... 30 Л итература:........................................................................................................... 32 Ссылки в Internet: ................................................................................................ 33 Сод ержание.......................................................................................................... 34

Page 35: Пособ ие по специ альности 071900 ОПДФ.11 Операци онные …window.edu.ru/resource/087/27087/files/jan04076.pdf · В Delphi реализ ована

35

Составители:

В ахтин А лексей А лександ рович, Семенов Станислав В лад имирович, Беляев Анд рей Сергеевич

Ред актор Бунина Т . Д .


Recommended