М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РФ В О РО Н Е Ж СК И Й Г О СУ Д А РСТ В Е Н Н Ы Й У Н И В Е РСИ Т Е Т
П о со б ...
20 downloads
275 Views
265KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РФ В О РО Н Е Ж СК И Й Г О СУ Д А РСТ В Е Н Н Ы Й У Н И В Е РСИ Т Е Т
П о со б ие п о сп е циал ь н о сти071900 О П Д .Ф .11 О п е рацио н н ы е систе м ы Ф айл о в ы й в в о д -в ы в о д в Windows. О то браж е н ие файл о в н а ад ре сн о е п ро стран ств о п ро грам м ы . Ф айл о в ы е систе м н ы е фун кцииWindows
В оронеж 2004
2
У тверж д ено научно-метод ическим советом Ф К Н протокол № 2 о т 10.12.2003.
Составители: В ахтин А . А ., СеменовС. В ., БеляевА . С. Реценз ентд оц. каф . яд ерной ф изики К . С. Ры бак
П особие под готовлено на каф ед ре программирования и инф ормационны хтехнологий ф акультета компью терны хнаук В оронеж ского госуд арственного университета. П ред наз начено д лястуд ентов3 курса д невного и вечернего отд елений .
3
В вод -вы вод , визуальны еили невизуальны еобъекты , сетевы ересурсы и мно гое д ругое непосред ственно связано с ресурсами о перацио нной системы и д оступ к ним вязы кахпрограммированияосущ ествляетсяспомощ ью станд артны хсред ств. О д ним из основны хстанд артны хи независимы хо т язы ка программирования сред ством пред оставленияресурсови управления о перационной системой Windows являетсябиблиотека WinAPI. О сновны м сред ством д оступа к ресурсам операционно й системы Windows являю тся системны е объекты . Д оступ к ним осущ ествляется с помощ ью уникального числа, котороеназы ваю тд ескриптор (Handle), а управлениеспомощ ью системны хф ункций (WinAPI-ф ункции). В сеописанны евд анном пособии ф ункции наход ятсявбиблиотекеkernel32.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 – опред еляетд оступ к д анны м вф ай ле:
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 – откры вает сущ ествую щ ий ф ай л и уд аляет все д анны еиз него. Е сли ф ай лнесущ ествует, то генеритсяош ибка;
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 – д ескрипто робъ екта.
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;
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. П р имеч а ние. В SetFilePointer.
Delphi ре ализован а ф ун кция FileSeek ан алогичн ая
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 //открываем файл
9
HFile:=CreateFile(OpenDialog1.FileName, GENERIC_READ, 0, nil, OPEN_EXISTING, 0,0); n:= GetLastError; if n0 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 n0 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;
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 – д анны есначала хранятсявпамяти и постепенно записы ваю тсявф ай л(испо льзуетсяпо умолчанию );
11
SEC_IMAGE – испо льзуется д ля отображ ения вы полнимы хф ай лов и программны хпакетов. Н есовместим сд ругими аттрибутами; SEC_NOCACHE – Д ляработы сд анны ми неиспольз уетсякэ ш . Д анны е пиш утся напрямую в ф изическую область памяти. Н е совместим с SEC_RESERVE и SEC_COMMIT; SEC_RESERVE – при получении ссы лки на ад ресное пространство , в котором отображ ены д анны е ф ай ла, вы д еляется но вое ад ресно е пространство. dwMaximumSizeHigh – Старш ие 32 бай та максимального размера вы д еляемой памяти д ляо тображ енияф ай ловы хд анны х. dwMaximumSizeLow – М лад ш ие 32 бай та максимального размера вы д еляемой памяти д ля ото браж енияф ай ловы хд анны х. Смещ ениеобязательно д олж но бы ть кратны м числу бай твод ной страницевиртуальной памяти. lpName – И мя объекта отображ ения. И спольз уется д ляпоиска объекта воперационно й системе. П ри успеш ной работе результатом ф ункции буд етд ескриптор на объект о тображ ения ф ай ла на ад ресное пространство программы , иначе – нулевое значение. Д ля получения код а ош ибки используй те ф ункцию GetLastError. П о окончании работы объект отображ ения ф ай ла на ад ресное пространство необход имо уд алить ф ункцией 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;
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 помещ ается размерстраницы вбай тах. Д ля освобож д енияо бласти памяти, вы д еленной ф ункцией MapViewOfFile, используетсяф ункция function UnmapViewOfFile(lpBaseAddress: Pointer): Boolean; П араметры ф ункции: lpBaseAddress – указатель на первы й э лемент вы д еленной области памяти. П ри успеш но й работе ф ункция возвращ ает true, иначе – false. К од о ш ибки мож но получить ф ункцией GetLastError.
13
П р имеч а ние. 1. Н е забывайт е ос вобож д ат ь выд е ле н н ую пам я т ь по окон чан ии работ ы! В с ис т е м н ом програм м ирован ии ос н ован од ин главн ый прин цип: взя л –полож и н а м е с т о. 2. В завис им ос т и от пос ле д оват е льн ос т и заполн е н ия пам я т и, очис т ка ос ущ е с т вля е т с я в обрат н ом поря д ке . Эт и правила обе с пе чивают корре кт н ос т ь работ ы и быс т род е йс т вие програм м ы. П рим ер о то б ра ж ен ия ф а йла н а а дресн о е про стра н ств о . В качестве примера рассмотрим процед уру, в которой копируется ф ай л, имя коро го записано в ESourceFile в ф ай л, записанны й в EDestinationFile. В о время копирования созд аетсяобъектотображ енияф ай ла на ад ресноепространство программы и д анны екопирую тсяпостранично. 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 GetLastError0 then raise Exception.Create('Ошибка открытия файла "'+ESourceFile.Text+'"'); //определяем размер файла LowSize:=0; HighSize:=0; LowSize:=GetFileSize(HSFile,@HighSize); if LowSize=Cardinal(-1) then begin CloseHandle(HSFile);
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;
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 Exception.Create('Ошибка удаления ссылки на данные файла "'+ESourceFile.Text+'"'); if not UnmapViewOfFile(FDPtr) then raise Exception.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 Exception.Create('Ошибка получения ссылки на данные файла "'+ESourceFile.Text+'"'); FDPtr:=nil; FDPtr:=MapViewOfFile(HDMap, FILE_MAP_WRITE,DSize div Par,DSize mod Par,SSizeDSize); if FDPtr=nil then raise Exception.Create('Ошибка получения ссылки на данные файла "'+EDestinationFile.Text+'"'); CopyMemory(FDPtr,FSPtr,SSize-DSize); DSize:=SSize;
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. Сравнить д ва ф ай ла по смы слово му сод ерж анию , то есть расстояния меж д у словами и раз д елителями не имею т значения, а сами слова счи-
17
таю тся од инаковы ми, если состоят из од нихи техж е букв (регистр игнорируется). 13. Сравнить д ва текстовы хф ай ла и вы вести в третий только те сло ва, которы еневстречаю тсясразу во боихф ай лах. 14. П рочитать текстовы й ф ай л. В ы вести инф ормацию о количестве слов, состоящ ихиз од ного, д вухсимволови т.д . 15. П росмотреть тексто вы й ф ай л либо отображ аяего символы , либо ш естнад цатеричноепред ставление. 16. И меется текстовы й ф ай л со общ ений (упоряд оченны хпо д ате). К аж д ая строка со стоит из д аты и самого сообщ ения. В ы вести всесообщ енияз а указ анны й период вновы й ф ай л. 17. И меется текстовы й ф ай л свед ений о студ ентах(не упоряд оченны й по д ате). К аж д ая строка состоит из д аты рож д ения и ф амилии студ ента. В ы вести список студ енто в, у которы хд ень рож д ения совпад ает с текущ ей д атой . 18. И з зад анного структурного ф ай ла, в кото ром хранится инф ормация о товарах(наименование, цена, количество), вы вести в д ругой ф ай л наименованиятовароввтекстовы й ф ай л. 19. П рочитать текстовы й ф ай л, в котором хранится статья уголовного код екса. В ы д елить из нее пункты д ля отд ельного просмотра, если известно, что признаком начала пункта является пред лож ение, состоящ ее из номера пункта сточкой . 20. И звестен раз мер блока д анны х структурированного ф ай ла. У д алить блоки, сод ерж ащ иетолько нули.
Ф а йло в ы е систем н ы е ф ун к ции Windows П оиск, уд аление, копирование, з ад ание атрибутов ф ай лов – э то операции, которы ед оступны через ф ункции WinAPI. Рассмотрим ф ункции д ля получения и ред актирования инф ормации о ф ай ле: размер, атрибуты , д ата созд анияф ай ла и послед него обновления. П олучить размер ф ай ла вбай тахмо ж но спомощ ью ф ункции function GetFileSize(HFile: THandle; var lpFileSizeHigh: Cardinal): Cardinal; П араметры ф ункции: HFile – д ескрипторф ай лового объекта. lpFileSizeHigh – старш ие32 бита размера ф ай ла. П ри успеш ной работе ф ункция возвращ аетмлад ш ие 32 бита размерности ф ай ла и, если размер ф ай ла больш е 4 Г бай т, в переменную
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; П араметры ф ункции:
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, то всоответствую щ ихпараметрахвозвращ аетсянуль. Д ля того чтобы зад ать д ату и времясозд ания, послед него д оступа и изменения, используетсяф ункция
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;
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-бит н ого чис ла, опре д е ля ющ е го разм е р ф айла в байт ах }
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.
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
24
dwFileAttributes: DWORD; {ат рибут ыф айла с м . GetFileAttributes и SetFileAttributes} ftCreationTime: TFileTime; {вре м я с озд ан ия ф айла. См . GetFileInformationByHandle} 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 – д ескрипто робъ екта поиска.
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;
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; П араметры ф ункции:
27
BufferLength – раз мербуф ера. Buffer – строка, вкоторую буд етввед ено имятекущ ей д иректории. Е сли ф ункцияотработала успеш но, то воз вращ аетсяд линна строки, записанной в Buffer. В случаеош ибок ф ункциявоз вращ аетнулевоезначение. Д ляполучениякод а ош ибки испо льзуй теGetLastError. В некоторы хпрограммахтребуетсясозд авать временны еф ай лы , которы еуд аляю тсяпо окончании работы программы , но вслучаесбо еввременны е ф ай лы остаю тся. Д лятого , чтобы исклю чить засорениед искового пространства временны ми ф ай лами, в операционной системеWindows сущ ествует папка д ля временны хф ай лов, кото рая период ически очищ аетсясамой системой по меренад обности. В некоторы хслучаятребуетсяполучить имяпапки, вкоторо й наход ятся ф ай лы , осно вны е д рай веры и библио теки операцио нной системы Windows. Н апример, д ляустановки какой -либо системной программы . П олучить имявременной папки мож но спомощ ью ф ункции 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; П араметры ф ункции:
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 –на д анном д иске хранятся системны е ф ай лы .
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 – пер. сангл. оболочка
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. В ы вести список всехскры ты хкаталоговиз зад анной папки.
31
3. В ы вести списо к ф ай ловв зад анном каталогесо след ую щ ими атрибутами только д лячтения, скры ты х, системны х, архивны х. 4. Д лявсехф ай лов из зад анного катало га д обавить атрибут«скры ты й » , если ф ай л только д ля чтения, и сбросить ф лаг «архивны й » во братном случае. 5. В ы вести имя ф ай ла из зад анного каталога с самой ранней д атой созд ания. 6. В сем ф ай лам из з ад анного каталога, которы ебы ли со зд аны нед елю назад или ранее, установить текущ ую д ату. 7. И з зад анной папки скопировать ф ай лы с опред еленны ми атрибутами в д ругую папку. 8. В зад анной папке уд алить ф ай лы , соз д анны е ранее опред еленной д аты , остальны епереименовать, д обавивк имени текущ ую д ату. 9. В ы вести список всехло гическихд исков и ихобщ ий о бъем и объем свобод ного пространства. О пред елить, д оступен ли д иск д лязаписи. 10. В ы вести имена и размервсехф ай ловиз зад анного каталога. 11. И з зад анного каталога вы вести имена всехпод каталогов, не сод ерж ащ ихвсебеф ай лов. 12. В ы вести полны й путь к временной папке(GetTempPath) и уд алить из нее всеф ай лы сзад анны м расш ирением. 13. Рекурсивно уд алить всепусты евлож енны епод катало ги з ад анного каталога. 14. П о маскерекурсивно уд алить всеф ай лы из всехпод каталоговз ад анного каталога. 15. Н аписать программу, под считы ваю щ ую размер вы бранного каталога на д иске. В ы вести инф ормацию о количествепапок и ф ай лов и ихатрибуты . 16. Н аписать навигато р по ф ай ло вой системе с воз мо ж но стью откры тия, просмотра и из мененияимени и атрибутовф ай ла (каталога). 17. Н аписать программу поиска ф ай ла по маске, д атесоз д ания, послед нему времени д оступа, размеру, атрибутам.
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 с.
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
34
С о держ а н ие Ф ай ловы еобъекты вWindows............................................................................. 3 Ф ай ловы й ввод -вы вод ........................................................................................... 6 П римерф ай лового ввод а-вы вод а........................................................................ 8 О то браж ениеф ай ловна ад ресноепространство программы ..................... 10 П римеротображ енияф ай ла на ад ресное пространство . ............................. 13 Зад ачи.................................................................................................................... 16 Ф ай ловы есистемны еф ункции Windows ......................................................... 17 Зад ачи на системны еф ункции .......................................................................... 30 Л итература:........................................................................................................... 32 Ссы лки вInternet: ................................................................................................ 33 Сод ерж ание.......................................................................................................... 34
35
Составители: В ахтин А лексей А лександ рович, Семено вСтаниславВ лад имирович, БеляевА нд рей Сергеевич Ред актор Бунина Т . Д .