KNOW INTUIT, Лекция, Работа с текстови файлове

Общи принципи на работа с файлове

В предишните примери записахме текст във файл и прочетохме текст от файл с помощта на свойства:

Този метод е удобен и добър, но не ни позволява да контролираме целия процес на запис във файл и четене от файл. Тоест тези функции извършват целия скрит от нас процес на четене и писане.

Това обаче се случва, когато програмистът почувства необходимостта да контролира тези процеси, освен това тези функции не са налични за всички типове. Например, имаме текст в низова променлива. Вече казахме, че една низова променлива може да съхранява почти неограничен брой знаци, тоест можем да запишем целия текстов файл в променливата, включително прекъсвания на редове и връщане на каретка (#13 #10). Функциите SaveToFile() и LoadFromFile() могат да работят с данни, които са от тип TStrings, но обикновените низове не могат да ги извикат. Следователно трябва да пишете директно във файла и също да ги четете директно.

Много програмисти предпочитат да използват функциите на WinAPI за работа с файлове. Въпреки страхотния звук, в тези функции няма нищо особено сложно, но такива функции имат един основен недостатък. MicroSoft непрекъснато прави промени в своите операционни системи. И така, в първите версии на Windows функцията WinAPI _lread се използва за четене на файлове. Тогава се появи функцията ReadFile и Microsoft започна да препоръчва използването й в програмирането. И тогава имаше функцията ReadFileEx, която ви позволява да работите с големи файлове. След всяка промяна на тези функции много често се налага да се преработи цялата програма, за да може да работи с новата операционна система. А това отнема много време и създавадопълнително неудобство както за програмисти, така и за потребители.

Затова Delphi препоръчва използването на вградения специализиран обект TFileStream. Ако Microsoft въведе някои нововъведения, Borland ще ги вземе предвид в обекта и ще трябва само да прекомпилираме нашата програма, без да променяме нейния код. Освен това използването на TFileStream е много по-лесно от функциите на WinAPI. TFileStream е обект и като всеки обект, първо трябва да бъде деклариран и след това инициализиран.

Първата стъпка е да създадете променлива от тип TFileStream:

По този начин сме декларирали променлива от типа на обекта TFileStream и в бъдеще можем да работим с тази променлива като с обект. Тоест, посочете името на тази променлива и след точката изберете свойствата, методите и събитията на този обект. Въпреки това, декларирането на променлива не е достатъчно; все още трябва да я инициализирате.

Методът Create на обект TFileStream може да има три параметъра, а третият параметър е незадължителен, може да бъде пропуснат. Нека да разгледаме тези опции.

Режим на отваряне. Тук можете да посочите една от следните опции:

  • fmCreate - Създаване на файл с името, посочено в първия параметър. Ако файлът вече съществува, той ще се отвори в режим на запис.
  • fmOpenRead - Отваряне на файл само за четене. Ако файлът не съществува, ще възникне грешка, така че първо трябва да проверите за съществуването на файла. Записването във файл в този режим не е възможно.
  • fmOpenWrite - Отваряне на файл за запис. Текущото съдържание на файла се унищожава и файлът се презаписва.
  • fmOpenReadWrite - Отворете файл за редактиране, тоест както за четене, така и за писане.

Разрешения, с които файлът ще бъде отворен. Този параметър не е задължителен и може да бъде пропуснат. Има следнотовъзможни стойности:

  • fmShareCompat – Други приложения също могат да работят с отворения файл.
  • fmShareExclusive - Други приложения няма да могат да отворят файла.
  • fmShareDenyWrite - Други приложения ще могат да отварят файла като само за четене, те няма да могат да записват данни в него.
  • fmShareDenyRead - Други приложения ще могат да отварят файла само за запис, няма да могат да го отварят за четене.
  • fmShareDenyNone - не пречи на други приложения да работят с файла.

Същото може да се случи, ако вашата програма се изпълнява в мрежовата версия. Например, има някакъв специален файл, в който служителите на отдела записват своите промени. Този файл може да се намира на някое мрежово устройство и всеки служител има достъп до него. И всеки служител има инсталирана вашата програма. По този начин, ако двама служители едновременно направят промени във файла, данните на единия от тях ще бъдат загубени, тъй като програмата на другия ще презапише файла, без да вземе предвид тези промени. Ако пишете програма за един потребител и само тя ще има достъп до файла, тогава можете напълно да забравите за третия параметър.

След като създадете обект, инициализирате го и работите с него, файлът трябва да бъде затворен и паметта, заета от този обект, трябва да бъде освободена. За да направите това, просто извикайте метода:

Сега остава да се справим със структурата на файла и методите за четене от него и запис в него. Да започнем със структурата.

Когато за първи път отворите файл, позицията на курсора се задава в началото и всеки опит за четене или запис ще бъде приложен към тази позиция на курсора. За да прочетете (пишете) на друга позиция, трябва да преместите курсора. За да направите това, използвайте метода Seek, който има два параметъра:

  • номер,указващ броя байтове (символи), към които да се премести курсора.
  • Откъде трябва да се преместите. Тук може да има три опции:
  • SoFromBeginning - преместване на посочения брой байтове от началото на файла.
  • SoFromCurrent - преместване от текущата позиция на курсора.
  • SoFromEnd - преместване на посочения брой байтове от края на файла към началото му.

Така че, за да преместите курсора от началото на файла с 10 байта, трябва да изпълните командата:

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

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

За да прочетете от файл, трябва да използвате метода Read, който също има два параметъра:

Нека анализираме пример за четене на 10 знака от файл, започвайки от 15-та позиция:

  1. Беше достигнат край на файла по време на четене и функцията прочете по-малко байтове от очакваното.
  2. Дискова грешка или друг проблем.

Методът Write се използва за запис във файл. Има два параметъра и има:

  1. Променливата, чието съдържание трябва да бъде записано.
  2. Броят байтове за запис.

Можете да използвате метода за запис по същия начин като метода за четене.

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