24_2 Робота з файлами у Windows.pptx
- Количество слайдов: 40
Робота з файлами у Windows Лекція Підготував Шахрайчук М. І. 11. 02. 2018 1
Робота з покажчиком позиції файла Перш ніж вивчати функцію для роботи з покажчиком позиції файла, розглянемо формат самого покажчика позиції файла. Покажчик позиції файла складається з двох значень типу DWORD, які називатимуться старша і молодша частина покажчика позиції файла відповідно. Отже, покажчик позиції має довжину в 64 біта. Якщо довжина файла не перевищує 2 -х гігабайт без 2 -х байт, тобто 231 -2 байти, то в покажчику позиції використовується тільки його молодша частина, яка розглядається як ціле число зі знаком, але при цьому старша частина покажчика позиції має бути встановлена в NULL. Функція Set. File. Pointer() працює з покажчиком позиції файла: 11. 02. 2018 2
Робота з покажчиком позиції файла DWORD Set. File. Pointer( HANDLE h. File, // дескриптор файла LONG l. Distance. To. Move, // молодша частина зсуву покажчика в байтах PLONG lp. Distance. To. Move. High, // покажчик на старшу частину зсуву покажчика в байтах DWORD dw. Move. Method); // початкова точка зсуву При вдалому завершенні вона повертає молодшу частину нової позиції покажчика файла, а за адресою, заданою параметром lp. Distance. To. Move. High, записує старшу частину нової позиції покажчика файла. Якщо функція встановлює старшу частину покажчика позиції в NULL, то молодша частина покажчика позиції представлена додатним цілим числом. У разі невдалого завершення Set. File. Pointer() повертає значення -1 і при цьому значення lp. Distance. To. Move. High = NULL. 11. 02. 2018 3
Робота з покажчиком позиції файла Якщо ж його значення не встановлене в NULL, то повернуте значення -1 може бути і дійсною молодшою частиною покажчика позиції. Тоді треба перевірити код останньої помилки, повернутий функцією Get. Last. Error(). Якщо він дорівнює NO_ERROR, то помилки немає, а інакше виконання функції Set. File. Pointer() завершилося невдало. Призначення параметрів Set. File. Pointer() таке: q h. File містить дескриптор файла, причому сам файл має бути відкритий в режимі читання або запису; q l. Distance. To. Move містить молодшу частину зсуву для покажчика позиції файла. Якщо lp. Distance. To. Move. High = NULL, то значення цього параметра розглядається як ціле число зі знаком. Якщо число додатне, то функція зсуває покажчик вперед на задане число байт, інакше - покажчик зсувається назад; 11. 02. 2018 4
Робота з покажчиком позиції файла q lp. Distance. To. Move. High повинен містити адресу старшої частини зсуву для покажчика позиції файла. Старша і молодша частини покажчика позиції розглядаються як ціле число зі знаком. Якщо значення цього параметра дорівнює NULL, то зсув задається тільки молодшою частиною. q dw. Move. Method задає початкову точку, від якої виконується зсув покажчика позиції. Цей параметр може приймати тільки одне з наступних значень: Ø FILE_BEGIN - зсув від початку файла; Ø FILE_CURRENT - зсув від поточної позиції файла; Ø FILE_END - зсув від кінця файла. 11. 02. 2018 5
Робота з покажчиком позиції файла У лістингу 24. 8 приведена програма, яка читає запис файла, заздалегідь встановивши на цей запис покажчик. До речі, таке читання записів файла називається прямим доступом до файла. Взагалі, прямий доступ до файла передбачає читання запису із заданим значенням ключа, що визначається вмістом одного або декількох полів запису. Правда, тоді треба знати залежність покажчика позиції файла від значення ключа запису. 11. 02. 2018 6
Робота з покажчиком позиції файла // Лістинг 24. 8. Встановлення покажчика позиції файла за допомогою функції Set. File. Pointer() #include "stdafx. h" int main() { HANDLE h. File; // дескриптор файла wchar_t lpsz. File. Name[]=L"C: \Users\Shogun\Documents\demo_file. dat"; long n; // для номера запису long p; // для покажчика позиції DWORD dw. Bytes. Read; // число байтів, які треба прочитати int m; // число прочитаних байт 11. 02. 2018 7
Робота з покажчиком позиції файла } // відкриваємо файл для читання h. File = Create. File( lpsz. File. Name, // ім'я файла GENERIC_READ, // читання із файла 0, // монопольний доступ до файла NULL, // захисту немає OPEN_EXISTING, // відкриваємо існуючий файл FILE_ATTRIBUTE_NORMAL, // звичайний файл NULL); // шаблона немає // перевіряємо на успішність відкриття if (h. File == INVALID_HANDLE_VALUE) { std: : cerr << "Create file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; 11. 02. 2018 8
Робота з покажчиком позиції файла // вводимо номер потрібного запису std: : cout << "Input a number from 0 to 9: "; std: : cin >> n; // зсуваємо покажчик позиції файла p = Set. File. Pointer(h. File, n * sizeof(int), NULL, FILE_BEGIN); if(p == -1) { std: : cerr << "Set file pointer failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // виводимо на консоль значення покажчика позиції файла std: : cout << "File pointer: " << p << std: : endl; 11. 02. 2018 9
Робота з покажчиком позиції файла // читаємо дані із файла if (!Read. File( h. File, // дескриптор файла &m, // адреса буфера, куди читаємо дані sizeof(m), // число байт, які треба прочитати &dw. Bytes. Read, // число прочитаних байт (LPOVERLAPPED)NULL // читання синхронне )) { std: : cerr << "Read file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } 11. 02. 2018 10
Робота з покажчиком позиції файла } // виводимо прочитане число на консоль std: : cout << "The read number: " << m << std: : endl; // закриваємо дескриптор файла Close. Handle(h. File); std: : cin. get(); return 0; 11. 02. 2018 11
Робота з покажчиком позиції файла Використовуючи Set. File. Pointer() можна визначити поточний стан покажчика позиції файла. Для цього треба просто зсунути покажчик файла від поточної позиції на нульове число байт. У результаті Set. File. Pointer() поверне поточний стан покажчика позиції файла. Починаючи з ОС Windows 2000, для роботи з покажчиком позиції файла можна використовувати функцію Set. File. Pointer. Ex(), яка простіша у використанні і має наступний прототип: BOOL Set. File. Pointer. Ex( HANDLE h. File, // дескриптор файла LARGE_INTEGER li. Distance. To. Move, // зсув у байтах PLARGE_INTEGER lp. New. File. Pointer, // новий покажчик позиції файла DWORD dw. Move. Method); // початкова точка зсуву12 11. 02. 2018 12
Робота з покажчиком позиції файла У разі вдалого завершення ця функція повертає ненульове значення, інакше - FALSE. Перший та останній параметри цієї функції мають таке ж призначення, як і у Set. File. Pointer(). Опишемо параметри, які залишилися. q li. Distance. To. Move задає зсув покажчика позиції файла, який розглядається як ціле число зі знаком. У разі додатного числа - зсув вперед, інакше - назад. q lp. New. File. Pointer повинен вказувати на об’єднання типу LARGE_INTEGER, в яке Set. File. Pointer. Ex() поверне нове значення індикатора позиції файла. Об’єднання типу LARGE_INTEGER має наступний формат: typedef union _LARGE_INTEGER { struct { DWORD Low. Part; // молодша частина LONG High. Part; // старша частина }; LONG Quad. Part; // всі частини } LARGE_INTEGER, *PLARGE_INTEGER; 11. 02. 2018 13 13
Робота з покажчиком позиції файла Якщо lp. New. File. Pointer = NULL, то нове значення індикатора позиції не повертатиметься. У лістингу 24. 9 приведена програма, яка для встановлення індикатора позиції використовує функцію Set. File. Pointer. Ex(), а потім читає з файла запис, на який встановлений індикатор позиції. // Лістинг 24. 9. Встановлення покажчика позиції файла при допомозі функції Set. File. Pointer. Ex() #include "stdafx. h" // #define _WIN 32_WINNT 0 x 0500 // або визначити цей макрос замість функції, якщо нова платформа extern "C" WINBASEAPI BOOL WINAPI Set. File. Pointer. Ex( HANDLE h. File, LARGE_INTEGER li. Distance. To. Move, PLARGE_INTEGER lp. New. File. Pointer, DWORD dw. Move. Method); 11. 02. 2018 14
Робота з покажчиком позиції файла int main() { HANDLE h. File; // дескриптор файла wchar_t lpsz. File. Name[]=L"C: \Users\Shogun\Documents\demo_file. dat"; int n; // для номера запису LARGE_INTEGER p, q; // для покажчика позиції DWORD dw. Bytes. Read; // число байт, які потрібно прочитати int m; // прочитане число байт // відкриваємо файл для читання h. File = Create. File( lpsz. File. Name, // ім'я файла GENERIC_READ, // читання із файла 0, // монопольний доступ до файла NULL, // захисту немає OPEN_EXISTING, // відкриваємо існуючий файл FILE_ATTRIBUTE_NORMAL, // звичайний файл NULL); // шаблона немає 11. 02. 2018 15
Робота з покажчиком позиції файла // перевіряємо на успішність відкриття if (h. File == INVALID_HANDLE_VALUE) { std: : cerr << "Create file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // вводимо номер потрібного запису std: : cout << "Input a number from 0 to 9: "; std: : cin >> n; q. High. Part = 0; q. Low. Part = n * sizeof(int); 11. 02. 2018 16
Робота з покажчиком позиції файла { } // зсуваємо покажчик позиції файла if(!Set. File. Pointer. Ex(h. File, q, &p, FILE_BEGIN)) std: : cerr << "Set file pointer failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; // виводимо на консоль значення покажчика позиції файла std: : cout << "File pointer: " << p. High. Part << ' ' << p. Low. Part << std: : endl; std: : cin. get(); 11. 02. 2018 17
Робота з покажчиком позиції файла // читаємо дані із файла if (!Read. File( h. File, // дескриптор файла &m, // адреса буфера, куди читаємо дані sizeof(m), // число байт, які потрібно читати &dw. Bytes. Read, // число прочитаних байт (LPOVERLAPPED)NULL // читання синхронне )) { std: : cerr << "Read file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } 11. 02. 2018 18
Робота з покажчиком позиції файла // виводимо прочитане число на консоль std: : cout << "The read number: " << m << std: : endl; } // закриваємо дескриптор файла Close. Handle(h. File); std: : cin. get(); return 0; 11. 02. 2018 19
Визначення і зміна атрибутів файла Отримати атрибути файла можна за допомогою функції Get. File. Attributes(), яка має наступний прототип: DWORD Get. File. Attributes(LPCTSTR lp. File. Name); // ім’я файла Завершившись вдало вона повертає атрибути файла, інакше - -1. В повернутому значенні встановлюються атрибути файла. Ці атрибути можна перевірити, використовуючи наступні прапорці: q FILE_ATTRIBUTE_ARCHIVE - архівний файл; q FILE_ATTRIBUTE_COMPRESSED - стиснутий файл; q FILE_ATTRIBUTE_DIRECTORY - файл є каталогом; q FILE_ATTRIBUTE_ENCRYPTED - шифрований файл; q FILE_ATTRIBUTE_HIDDEN - прихований файл; q FILE_ATTRIBUTE_NORMAL - нормальний файл; q FILE_ATTRIBUTE_NOT_CONTENT_INDEXED-файл не індексується; q FILE_ATTRIBUTE_OFFLINE - файл у зовнішній пам’яті; q FILE_ATTRIBUTE_READONLY - файл тільки для читання; q FILE_ATTRIBUTE_REPARSE_POINT - файл вимагає інтерпретації; q FILE_ATTRIBUTE_SPARSE_FILE - розріджений файл; q FILE_ATTRIBUTE_SYSTEM - системний файл; q FILE_ATTRIBUTE_TEMPORARY - тимчасовий файл. 11. 02. 2018 20
Визначення і зміна атрибутів файла Про інші атрибути файла, які не увійшли до наведеного вище списку, можна довідатися, використовуючи функцію Get. File. Attributes. Ex(). Змінити атрибути файла можна за допомогою функції Set. File. Attributes(), яка має наступний прототип: BOOL Set. File. Attributes( LPCTSTR lp. File. Name, // ім’я файла DWORD dw. File. Attributes); // атрибути файла При вдалому завершенні вона повертає ненульове значення, інакше - FALSE. Параметр lp. File. Name містить ім’я файла, а dw. File. Attributes дає змогу встановити наступні атрибути файла: q FILE_ATTRIBUTE_ARCHIVE - архівний файл; q FILE_ATTRIBUTE_HIDDEN - прихований файл; q FILE_ATTRIBUTE_NORMAL – нормальний файл; q FILE_ATTRIBUTE_NOT_CONTENT_INDEXED - файл не індексується; q FILE_ATTRIBUTE_OFFLINE - файл у зовнішній пам’яті; q FILE_ATTRIBUTE_READONLY - файл тільки для читання; q FILE_ATTRIBUTE_SYSTEM - системний файл; q FILE_ATTRIBUTE_TEMPORARY - тимчасовий файл. 11. 02. 2018 21
Визначення і зміна атрибутів файла При цьому відмітимо, що якщо встановлюється прапорець FILE_ATTRIBUTE_NORMAL, то він має бути один, бо всі інші атрибути, анулюють цей атрибут. У лістингу 24. 10 приведена програма, яка читає і змінює атрибути файла. // Лістинг 24. 10. Читання і зміна атрибутів файла #include "stdafx. h" int main() { DWORD file_attr; wchar_t lpsz. File. Name[] = L"C: \Users\Shogun\Documents\demo_file. dat"; // читаємо атрибути файла file_attr = Get. File. Attributes(lpsz. File. Name); if(file_attr == -1) { std: : cerr << "Get file attributes failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } 11. 02. 2018 22
Визначення і зміна атрибутів файла // перевіряємо, чи є файл нормальним if(file_attr == FILE_ATTRIBUTE_NORMAL) { std: : cout << "This is a normal file. " << std: : endl; std: : cin. get(); } else { std: : cout << "This is a not normal file. " << std: : endl; std: : cin. get(); } // встановлюємо атрибут прихованого файла if(!Set. File. Attributes(lpsz. File. Name, FILE_ATTRIBUTE_HIDDEN)) { std: : cerr << "Set file attributes failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } 11. 02. 2018 23
Визначення і зміна атрибутів файла // Тепер можна перевірити, що файл став прихований std: : cout << "Now the file is hidden. " << std: : endl << "Press any key to continue. "; std: : cin. get(); } // Робимо назад файл звичайним if(!Set. File. Attributes(lpsz. File. Name, FILE_ATTRIBUTE_NORMAL)) { std: : cerr << "Set file attributes failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } std: : cout << "Now the file is again normal. " << std: : endl; std: : cin. get(); return 0; 11. 02. 2018 24
Визначення і зміна атрибутів файла 11. 02. 2018 25
Визначення і зміна розмірів файла Розмір файла є цілим числом і для його зберігання треба два значення типу DWORD або, іншими словами, два подвійні слова. Перше - містить старшу частину розміру файла, а друге - молодшу. Якщо розмір файла поміщається тільки в молодшу частину, то значення старшої буде NULL. Визначити розмір файла можна, використавши функцію Get. File. Size(), яка має наступний прототип: DWORD Get. File. Size( HANDLE h. File, // дескриптор файла LPDWORD lp. File. Size. High); // покажчик на старшу частину розміру файла У разі вдалого завершення вона повертає молодшу частину розміру файла, а за адресою в параметрі lp. File. Size. High, записує старшу частину розміру файла. У разі невдачі Get. File. Size() повертає значення -1, якщо значення lp. File. Size. High, встановлене в NULL. 11. 02. 2018 26
Визначення і зміна розмірів файла Якщо ж значення цієї адреси не дорівнює NULL і функція закінчилася невдачею, то вона повертає значення -1 і функція коду останньої помилки Get. Last. Error() поверне значення, відмінне від NO_ERROR. Для правильної роботи Get. File. Size() потрібно, щоб файл був відкритий в режимі читання/запису. // Лістинг 24. 11. Визначення розміру файла за допомогою функції Get. File. Size() #include "stdafx. h" int main() { HANDLE h. File; wchar_t lpsz. File. Name[]=L"C: \Users\Shogun\Documents\demo_file. dat"; DWORD dw. File. Size; // молодша частина розміру файла 11. 02. 2018 27
Визначення і зміна розмірів файла // відкриваємо файл для читання h. File = Create. File( lpsz. File. Name, // ім'я файла GENERIC_READ, // читання із файла 0, // монопольний доступ до файла NULL, // захисту немає OPEN_EXISTING, // відкриваємо існуючий файл FILE_ATTRIBUTE_NORMAL, // звичайний файл NULL); // шаблона немає // перевіряємо на успішне відкриття if (h. File == INVALID_HANDLE_VALUE) { std: : cerr << "Create file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } 11. 02. 2018 28
Визначення і зміна розмірів файла // визначаємо розмір файла dw. File. Size = Get. File. Size(h. File, NULL); if (dw. File. Size == -1) { std: : cerr << "Get file size failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; } Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // виводимо розмір файла std: : cout << "File size: " << dw. File. Size << std: : endl; // закриваємо дескриптор файла Close. Handle(h. File); std: : cin. get(); return 0; 11. 02. 2018 29
Визначення і зміна розмірів файла 11. 02. 2018 30
Визначення і зміна розмірів файла Визначити розмір файла можна також за допомогою функції Get. File. Size. Ex() (підтримується тільки ОС Windows 2000 і Windows XP). Вона має наступний прототип: BOOL Get. File. Size. Ex( HANDLE h. File, // дескриптор файла PLARGE_INTEGER lp. File. Size); // розмір файла У разі успішного завершення функція повертає ненульове значення, інакше - FALSE. Параметр h. File цієї функції повинен містити дескриптор файла, а параметр lp. File. Size вказує на об’єднання типу LARGE_INTEGER, в яке функція Get. File. Size. Ex() записує розмір файла. Формат об’єднання типу LARGE_INTEGER приведений на слайді 13. У лістингу 24. 12 приведена програма, яка визначає розмір файла, використовуючи функцію Get. File. Size. Ex(). 11. 02. 2018 31
Визначення і зміна розмірів файла // Лістинг 24. 12. Визначення розміру файла за допомогою функції Get. File. Size. Ex() #include "stdafx. h" int main() { HANDLE h. File; wchar_t lpsz. File. Name[] = L"C: \Users\Shogun\Documents\demo_file. dat"; LARGE_INTEGER li. File. Size; // розмір файла // відкриваємо файл для читання h. File = Create. File( lpsz. File. Name, // ім'я файла GENERIC_READ, // читання із файла 0, // монопольний доступ до файла NULL, // захисту немає OPEN_EXISTING, // відкриваємо існуючий файл FILE_ATTRIBUTE_NORMAL, // звичайний файл NULL); // шаблона немає 11. 02. 2018 32
Визначення і зміна розмірів файла } // перевіряємо на успішність відкриття if (h. File == INVALID_HANDLE_VALUE) { std: : cerr << "Create file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // визначаємо розмір файла if (!Get. File. Size. Ex(h. File, &li. File. Size)) { std: : cerr << "Get file size failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // виводимо розмір файла std: : cout << "File size: " << li. File. Size. Low. Part << std: : endl; // закриваємо дескриптор файла Close. Handle(h. File); std: : cin. get(); return 0; 11. 02. 2018 33
Визначення і зміна розмірів файла Змінити розмір файла можна за допомогою функції Set. End. Of. File(), яка має наступний прототип: BOOL Set. End. Of. File(HANDLE h. File); // дескриптор файла При вдалому завершенні вона повертає ненульове значення, інакше - FALSE. Параметр функції є дескриптор файла, розмір якого змінюється. При цьому відмітимо, що файл має бути відкритий в режимі запису. Функція Set. End. Of. File() працює таким чином. Вона пересуває маркер кінця файла EOF на позицію, яку містить покажчик позиції файла. Якщо покажчик позиції файла вказує на запис, який не є останнім, то всі записи, які знаходяться за поточним записом, відкидаються. 11. 02. 2018 34
Визначення і зміна розмірів файла Таким чином, у цьому випадку вміст файла урізається. Якщо ж покажчик позиції файла вказує за межі файла, то розмір файла розширюється за рахунок додавання нових кластерів до нього. При цьому вміст доданих кластерів не визначений. У лістингу 24. 13 наведений приклад програми, яка зменшує розмір файла в два рази. // Лістинг 24. 13. Зміна розміру файла #include "stdafx. h" int main() { HANDLE h. File; // дескриптор файла wchar_t lpsz. File. Name[] = L"C: \Users\Shogun\Documents\demo_file. dat"; DWORD dw. File. Size; long p; 11. 02. 2018 // розмір файла // покажчик позиції 35
Визначення і зміна розмірів файла // відкриваємо файл для читання h. File = Create. File( lpsz. File. Name, // ім'я файла GENERIC_WRITE, // запис у файл 0, // монопольний доступ до файла NULL, // захисту немає OPEN_EXISTING, // відкриваємо існуючий файл FILE_ATTRIBUTE_NORMAL, // звичайний файл NULL); // шаблона немає // перевіряємо на успішність відкриття if (h. File == INVALID_HANDLE_VALUE) { std: : cerr << "Create file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } 11. 02. 2018 36
Визначення і зміна розмірів файла // визначаємо розмір файла dw. File. Size = Get. File. Size(h. File, NULL); if (dw. File. Size == -1) { std: : cerr << "Get file size failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // виводимо на консоль розмір файла std: : cout << "Old file size: " << dw. File. Size << std: : endl; // зменшуємо розмір файла вдвічі dw. File. Size /= 2; // зсуваємо покажчик позиції файла p = Set. File. Pointer(h. File, dw. File. Size, NULL, FILE_BEGIN); 11. 02. 2018 37
Визначення і зміна розмірів файла if(p == -1) { std: : cerr << "Set file pointer failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // встановлюємо новий розмір файла if (!Set. End. Of. File(h. File)) { std: : cerr << "Set end of file failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // визначаємо новий розмір файла dw. File. Size = Get. File. Size(h. File, NULL); 11. 02. 2018 38
Визначення і зміна розмірів файла } if (dw. File. Size == -1) { std: : cerr << "Get file size failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // виводимо на консоль розмір файла std: : cout << "New file size: " << dw. File. Size << std: : endl; // закриваємо дескриптор файла Close. Handle(h. File); std: : cin. get(); return 0; 11. 02. 2018 39
Визначення і зміна розмірів файла } if (dw. File. Size == -1) { std: : cerr << "Get file size failed. " << std: : endl << "The last error code: " << Get. Last. Error() << std: : endl; Close. Handle(h. File); std: : cout << "Press any key to finish. "; std: : cin. get(); return 0; } // виводимо на консоль розмір файла std: : cout << "New file size: " << dw. File. Size << std: : endl; // закриваємо дескриптор файла Close. Handle(h. File); std: : cin. get(); return 0; 11. 02. 2018 40
24_2 Робота з файлами у Windows.pptx