68921

Робота з файлами та каталогами

Лекция

Информатика, кибернетика и программирование

Як і в будь-якій мові програмування, робота з файлом здійснюється в три етапи: Відкриття файлу — при цьому повертається ціле число — ідентифікатор (дескриптор) файлу. Подальше звернення до файлу здійснюється через дескриптор, а не по імені. Обробка файлу (читання або запис). Закриття файлу.

Украинкский

2014-09-27

71.5 KB

1 чел.

Лекція № 14

Тема: Робота з файлами та каталогами

План

  1.  Основні операції з файлами
  2.  Функції маніпулювання файлами
  3.  Функції для роботи з іменами файлів
  4.  Функції для роботи з каталогами

Основні операції з файлами

Як і в будь-якій мові програмування, робота з файлом здійснюється в три етапи:

Відкриття файлу — при цьому повертається ціле число — ідентифікатор (дескриптор) файлу. Подальше звернення до файлу здійснюється через дескриптор, а не по імені.

Обробка файлу (читання або запис).

Закриття файлу.

Функція fopen( Sfilename, $mode) відкриває файл (або URL) і повертає його ідентифікатор. Даній функції потрібно передати два параметри — ім'я файлу ($filename) і режим ($mode), в якому необхідно відкрити файл.

Примітка.

Насправді, функція fopen() має три аргументи, але третій аргумент зазвичай не використовується — він заданий за умовчанням. Останній аргумент, який за умовчанням рівний false, говорить, що якщо задано відносне ім'я файлу (а не повний шлях до файлу), то файл також потрібно шукати в списку шляхів, які використовуються інструкціями include і require.

Ім'я файлу — це звичайний рядок. Можна указувати, як повний, так і відносний шлях до файлу. При вказівці відносного шляху використовують каталоги «..» (дві крапки ) — батьківський каталог і «.» (крапка) — поточний каталог.

./array.txt — файл знаходиться в поточному каталозі;

. ./array.txt — файл в батьківському каталозі;

../command/array.txt — файл вподкаталогесоттаперодительского каталога.

Доступні режими відкриття файлу приведені в таблиці

Режим

Опис

r

Режим "тільки читання". У цьому режимі ви можете тільки читати файл, але не змінювати його. Після відкриття покажчик файлу встановлюється на його початок (перший байт). У випадку, якщо файл не існує, функція повертає false

r+

Файл відкривається в режимі "читання/запис", тобто ви можете не тільки читати, але і записувати дані у файл. Після відкриття файлу покажчик встановлюється на його початок. Як і в режимі г, якщо файл не існує, функція повертає false. ВАЖЛИВО: якщо у момент запису покажчик файлу знаходиться десь в середині файлу, то записувані дані будуть записані поверх що вже є, а не будуть "вставлені" між ними

w

Буде створений пустий файл. Якщо файл існує – він буде перезаписаний

w+

Нагадує режим r+ проте з наступними відмінностями – якщо файл не існує – він буде створений; якщо існує – перезаписаний. Дані можна як читати так записувати в файл.

а

Режим доповнення (append). Файл відкривається в режимі запису, а а вказівник файлу переміщується в кінець файлу. Дані будуть додані в кінець файлу. Якщо файл не існує - функція повертає false

а+

Самий універсальний режим. Файл відкривається в режимі читання і запису, при цьому його вміст не віддаляється, а покажчик файлу переміщається на кінець файлу. Якщо файл не існує, він буде створений

b, t

Модифікатор b вказує на те, що файл буде відкритий в бінарному режимі, a t — в текстовому. Якщо модифікатор не вказаний – по замовчуванню файл відкривається в бінарному режимі

Примітка.

Чомусь про модифікатор режиму t нічого не сказано в документації, але мої експерименти показують, що він працює. Якщо не вірите, можете переконатися в цьому самі.

Функція fseek() «перемотує» файл на певну позицію. У приведеному прикладі ми встановили покажчик поточної позиції на п'яту позицію.

При використанні функції fseek() їй потрібно передати три параметри — ідентифікатор файлу, зсув (позицію, на яку необхідно перейти), і вказівка, звідки потрібно відлічувати зсув. Як вказівка використовуються наступні константи:

SEEK_SET (або 0) — з початку файлу;

SEEK_CUR (або 1) — з поточної позиції;

SEEK_END (або 2) — з кінця файлу.

У разі успішного завершення функція повертає 0, а у разі помилки —1.

Відразу після fseek() ми викликаємо функцію fwrite, яка записує рядок BYTE поверх (режим r+) вже наявних у файлі даних. Звернете увагу, що ми перезаписали чотири символи: l,\n,Li. А це означає, що рядків у файлі буде вже не три, а дві, оскільки ми перезаписали символ нового рядка (див. мал. 11.4).

Функція fflush() записує на диск всі зміни, які були проведені з вказаним як параметр відкритим файлом. Тобто, зберігає те, що поточне складається файлу з буфера введення/висновку на диск. Чому ми використовували цю функцію? Збереження відбувається при закритті файлу, але ми ще не знаємо, як це робити, тому ми використовуємо функцію fflush().

Функцію fflush() рекомендується викликати в програмі кілька разів — хоч би двічі — в середині обробки файлу і в самому кінці. Адже якщо відбудеться який-небудь збій (наприклад, збій живлення), ваші дані будуть втрачені, а якщо ви викличете fflush(), то уціліє якась частина оброблених даних. Перед закриттям також бажано викликати функцію fflush(), щоб примусово примусити систему скинути вміст буферів на диск. Функцію fflush() можна навіть використовувати замість закриття файлу: PHP сам закриє файл при завершенні роботи сценарію.

Якщо ви не хочете по десять разів викликати функцію fflush(), ви можете встановити розмір буфера для файлу таким, щоб у разі відмови системи або живлення, втрати інформації були мінімальними. Можна взагалі відключити буферизацію для певного файлу, але в цьому випадку, особливо, при великому об'ємі передаваної інформації, продуктивність програми різко знизиться. Щоб встановити розмір буфера, використовуйте функцію set_file_bufFer(int $f, int Sbufer_size). Наступний виклик відключає буферизацію (всі зміни відразу ж будуть записані прямо на диск) для файлу $f:

set_file_buffer($f,0);

Тепер розглянемо дуже важливу функцію — feof(), яка повертає true, якщо досягнутий кінець файлу.

Прочитати весь файл в один рядок можна за допомогою такого оператора:

$s = fread($f, filesize($f));

Проте для цього існують ефективніші функції, наприклад, file(), яку ми розглянемо пізніше.

Ще одна функція, яку корисно використовувати при роботі з файлами в бінарному режимі, — це ftell(), яка повертає поточне положення покажчика файлу. Передати цій функції потрібно всього лише один параметр — ідентифікатор файлу.

Для відрядкового читання файлів використовується функція fgets(int $f, int $length), яка читає з файлу $f рядок завдовжки $length символів. Символ нового рядка також включається в результат. Якщо рядок займає більше, ніж $length-l символів, то повертаються тільки $length-l символів рядка. А якщо рядок займає більше, ніж $length-l символів, то повертаються всі символи до кінця рядка (т.е. до символу /n).

Зазвичай для відрядкового читання файлу набагато зручніше використовувати функцію file(), яку ми розглянемо пізніше. Ця функція працює набагато швидше, а про функцію fgets() потрібно знати тільки для загального розвитку.

Для запису рядка в текстовому режимі використовується функція fputs(int $f, string $s), яка записує рядок $s у текстовий файл $f.

Остання операція над файлом — це його закриття. Закрити файл $f допоможе функція fcIose(SO- Звичайне закриття файлу не потрібне, оскільки PHP сам закриє всі відкриті програмою файли після закінчення роботи програми. Проте, все ж таки бажано не вважатися на PHP, а виконати закриття файлу уручну. По-перше, якщо програма ще продовжуватиметься (після обробки файлу), то ми заощадимо пам'ять. По-друге, якщо ви що-небудь записали у файл, то, щоб уникнути втрати інформації, потрібно його закрити (хіба мало що може трапитися), а ще краще викликати функцію fflush() По-третє, закриття файлу вимагає сама культура програмування.

Дуже корисною є функція file (string Sfilename), яка читає весь файл в список, кожен елемент якого рівний рядку, прочитаному з файлу. Шлях у нас є файл llnes.txt:

Linel\n Line2\n Line3

Після виклику $List «= file("lines.txt") в масиві $List буде три елементи "Linel\n", "Line2\n", "Line3". Потрібно відмітити, що функція не вирізує символи нового рядка і не виконує їх трансляцію. Це означає, що якщо наш файл буде записаний в Windows-форматі:

Linel\r\n Line2\r\n Line3

То елементи масиву $List міститимуть символи \r\n.

Функції маніпулювання файлами

До цієї групи відносяться функції копіювання, перейменування, видалення файлів, а також деякі інші функції.

Для копіювання файлів використовується функція copy(string Ssource, string Sdest). Ця функція копіює файл з ім'ям $source у файл з ім'ям $dest. Якщо файл $dest існує, він буде перезаписаний, тому ви повинні перевірити існування файлу за допомогою функції file_exists(), яка буде розглянута нижче.

Ще один момент, про який ви повинні поклопотатися перш, ніж почати копіювання. Ви повинні мати право на запис в каталог, в якому повинен знаходитися файл $dest, і в сам файл, якщо він до виклику функції існував, щоб перезаписати його.

Функція copy () повертає true, якщо файл вдало скопійований, і false — в зворотному випадку.

Перейменувати файл можна за допомогою функції rename(string Soldname, string Snewname). Функція перейменує файл $oldname у файл $newname. У випадку, якщо перейменувати файл не можна, функція поверне false. Це може відбутися в наступних випадках:

Файл $oldname не існує.

У вас немає прав доступу до файлу $oldname.

Файл з ім'ям 5newname вже існує. Звернете увагу, функція rename(), на відміну від функції сміттю(), не перезаписує файл.

Ім'я $newname знаходиться на іншій файловій системі, тобто на
іншому розділі диска або мережевій файловій системі.

Інші причини.

Видалити файл можна функцією unlink(string Sname). Функція повертає false, якщо файл не вдалося видалити.

Примітка.

Може виникнути питання: «Чому ця функція називається unlink(), а не remove(), erase() або delete()»? Річ у тому, що файлова система Unix-подібних операційних систем дозволяє створювати жорсткі і м'які (або символічні) посилання на файли - hard and soft (symbolic) links. Жорстке посилання - це ні що інше, як ім'я файлу. При цьому файлова система може містити один і той же файл, але використовувати для доступу до нього різні імена. Визначити жорсткі посилання просто - імена файлів разные, а номери инодов (інформаційних дескрипторів, індивідуальних для кожного файлу) - однакові. Всі жорсткі посилання (імена) є рівноправними, і ви не можете видалити файлдо тих пір, поки існує хоч би одне жорстке посилання на нього. Перш ніж видалити файл, ви повинні видалити всі жорсткі посилання, файл буде видалений, коли буде видалено його останнє ім'я. Все вищесказане не відноситься до символічних посилань. Таким чином, стає зрозуміло, чому функція видалення файлу називається unlink().

Функції для роботи з іменами файлів

Досить часто доводиться мати справу з іменами файлів. При цьому потрібний, то приєднати ім'я файлу до імені каталога, то навпаки — виділити з повного шляху безпосереднє ім'я файлу, і т.д.

Зі всіх функцій даної групи на перевірку виявилися корисними тільки чотири:

file_exists() — перевіряє існування файлу з вказаним ім'ям;

basename() — виділяє ім'я файлу з повного шляху;

dirname() — повертає ім'я каталога з повного шляху;

realpath() — перетворить відносний шлях до файлу в абсолютний;

tempname() — генерує ім'я тимчасового файлу.

Функції для роботи з каталогами

Маніпуляції з каталогами

При написанні сценаріїв, окрім вже описаних функцій для роботи з каталогами, нам пригодятся ще три:

mkdir (string Sdir_name int Sperms) — створює каталог з ім'ям
$dir_name і правами доступу $perms.

rmdir( string Sdir_name) — видаляє порожній каталог.

getcwd() — повертає поточний каталог.

chdir(string Sdir_name) — змінює поточний каталог.

Каталог — це звичайний файл, що містить інформацію про файли, що знаходяться «в нім». Послідовність роботи з каталогом така ж, як і з файлом: відкрити, прочитати (писати в каталог ми не можемо) і закрити. Для цього в PHP є три функції:

opendir(string $dir_name) — відкриває каталог, після чого ми можемо
працювати з каталогом: читати зміст каталога. Функція повертає дескриптор каталога $handle, який потрібно указувати як
аргументу при виклику інших функцій для роботи з каталогом;

readdir(int Shadle) — прочитує наступне ім'я файлу або підкаталогу, які знаходяться в каталозі, заданим дескриптором Shandle;

closedir(int ShadIe) — закриває каталог.

Приклад сумісного використання всіх трьох функцій приведений в лістингу.

Лістинг. Відкриття, читання і закриття каталогів

<?

$dir = opendir("/var/www/html"); chdir("/var/www/html");

while ($d=readdir($dir))

{

echo “$d<br>”;

}

closedir($dir);

?>


 

А также другие работы, которые могут Вас заинтересовать

48221. ОРГАНІЗАЦІЯ ТА ПЛАНУВАННЯ ВИРОБНИЦТВА 667.5 KB
  Системи договірних відносин на оптовому ринку електроенергії. У загальному розумінні поняття енергетичний ринок можна трактувати як місце зустрічі продавця енергії та її покупця. Таким чином енергетичний ринок у широкому розумінні містить таких учасників ринку як підприємства видобувачі паливноенергетичних ресурсів організації що переробляють ці ресурси постачальники кінцевої енергії споживачі енергії а також підприємства що виготовляють товари та надають послуги які забезпечують процес виробництва енергії наприклад основні фонди...
48222. Технічна механіка 8.62 MB
  Технічна механіка є фундаментальною загальнотехнічною дисципліною, невід’ємною складовою системи підготовки інженерно-технічних працівників. Під час вивчення курсу студенти оволодівають знаннями законів рівноваги та руху матеріальних тіл, методів розрахунку елементів конструкцій, машин та споруд на міцність, жорсткість, стійкість, основами проектування деталей, вузлів машин. Знання дисципліни необхідні спеціалістам, які повинні організовувати належну експлуатацію й обслуговування сучасної залізничної техніки, удосконалювати її конструкцію та технології застосування.
48223. ТЕРМИЧЕСКИЕ МЕТОДЫ ОЧИСТКИ ВОД 81.5 KB
  Установки термического обезвреживания минерализованных сточных вод должны соответствовать следующим основным требованиям: I обеспечивать снижение концентрации вредных веществ в очищаемой воде до значений меньших ПДК; 2 иметь незначительную чувствительность к составу стоков; 3 обеспечивать надежность и экономичность в работе; 4. Концентрирование сточных вод Многокорпусные выпарные установки. На практике используют однокорпусные и многокорпусные выпарные установки включающие аппараты с естественной и принудительной циркуляцией. Наибольшее...
48224. Основні підходи до визначення поняття парламентаризму 56 KB
  : Поняття П = відображає з одно боку місце парламенту в мехзмі поділу влади і в цьому значенні наближене до політичного режиму а з іншого принципи устрою парламенту. влади: У вузькому розумінні: оргція і функціонування органу законодавчої влади що хться верховенством парламенту наявністю в нього виключних прерогатив і повноважень Журавський В. влади з особливою активною 1998 роллю парламенту. влади з вагомою і значною роллю парламенту передбаченими Кцією можливостями його активного впливу на сусп.
48225. Бізнес план виноробного заводу «INKERMAN International» 135 KB
  Щорічно вина Inkerman виграють тендер Міністерства закордонних справ України, присутні на заходах державного рівня — поставляються до закордонних представництв і посольств України, подаються на всіх офіційних дипломатичних прийомах.
48226. Теорія та методика обраного виду спорту 155 KB
  До таких показників ставляться: час рухової реакції час виконання одиночного руху величина й характер зусиль що розвивають дані про біоелектричну активність м'язів частота скорочень серця частота подиху вентиляція легенів серцевий викид споживання кисню швидкість нагромадження й кількість лактата в крові. При визначенні ступеня специфічності вправ потрібно орієнтуватися не тільки на зовнішню форму рухів але й на характер їхньої координаційної структури особливості функціонування м'язів вегетативні реакції. До вправ загального...
48227. Релігієзнавство. Курс лекцій 486 KB
  Це зумовлено тією роллю яку відіграє релігія в житті сучасного суспільства та окремої людини впливом релігії на політику культуру тощо. Інтерес до закономірностей розвитку релігії її історії інших проблем пов'язаних з взаємовідносинами церкви і держави міжконфесійними стосунками постійно зростає. Таким чином слід наголосити що об'єкт і предмет релігієзнавства співпадають: це закономірності становлення та розвитку релігії її роль у житті суспільства та індивіда. До структури релігієзнавства насамперед входять такі науки:  Філософія...
48228. ТЕОРЕТИЧНІ ОСНОВИ МЕТРОЛОГІЧНОГО ЗАБЕЗПЕЧЕННЯ ВИТРАТОВИМІРЮВАННЯ 3.65 MB
  ТЕОРЕТИЧНІ ОСНОВИ МЕТРОЛОГІЧНОГО ЗАБЕЗПЕЧЕННЯ ВИТРАТОВИМІРЮВАННЯ КОНСПЕКТ ЛЕКЦІЙ Для студентів спеціальності Метрологія та інформаційновимірювальна техніка Рекомендовано методичною радою університету ІваноФранківськ 2011 ІваноФранківський національний технічний університет нафти і газу С. Лекційне заняття №3 Класифікація засобів відтворення і вимірювання одиниць обєму та обємної витрати газу. Газова промисловість України як окрема галузь паливноенергетичного напряму економіки держави складає сьогодні чи не...
48229. ТЕОРИЯ ОРГАНИЗАЦИИ 542.5 KB
  Фокина ТЕОРИЯ ОРГАНИЗАЦИИ Курс лекций для студентов специальности Менеджмент организации ИЗДАТЕЛЬСТВО САРАТОВСКОГО УНИВЕРСИТЕТА Теория организации: Курс лекций для студ. Менеджмент организации.В курсе лекций рассмотрены основные вопросы теории организации предусмотренные образовательным стандартом а также некоторые новые проблемы и точки роста.