Работа с файлове в Delphi, Delphi, Delphi компоненти, Delphi изходни кодове

Работа с файлове в Delphi

Ето защо се препоръчва използването на специализирания TFiiestream обект на Delphi. Можете да напишете свой собствен клас, за да направите същото, но TFiiestream го прави доста добре.

TFileStream има още едно предимство - не е необходимо да следите иновациите на Microsoft. В тази корпорация непрекъснато идват нови идеи, поради които се появяват нови функции, а ние, програмистите, трябва постоянно да учим нови неща и да пренаписваме кода. Лично аз вече страдах от функциите за работа с файлове. Има толкова много от тях, че на пръв поглед дори няма да разберете кои са нови и препоръчителни за употреба и кои са остарели. Във всеки случай използването на този обект е много по-просто от WinAPI, така че е препоръчително да започнете да се учите как да работите с файлове от него.

Така че нека да разгледаме обекта TFileStream. Първото нещо, което трябва да направите, е да декларирате някаква променлива от тип TFileStream:

Ето как декларирахме променливата f да бъде от тип TFileStream. Сега можем да инициализираме променливата.

Инициализация - разпределяне на памет и задаване на стойности по подразбиране. Методът create е отговорен за тези действия. Просто трябва да го извикате и да присвоите резултата от изпълнението на променлива. Например, в нашия случай трябва да извикате TFileStream.create и да запишете резултата в променливата f.

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

  • Името на файла (или пълния път до файла), който да отворите. Този параметър е прост низ.
  • режим на отваряне. Тук можете да посочите една от следните опции за отваряне на файл:
  • fmCreate - създаване на файл с посочения в първия параметъриме. Ако файлът вече съществува, той ще се отвори в режим на запис;
  • fmOpenRead - отваряне на файл само за четене. Ако файлът не съществува, ще възникне грешка. Записването във файл не е възможно в този случай;
  • fmopenwrite - отваряне на файл за писане. В този случай по време на запис текущото съдържание се унищожава;
  • fmOpenReadWrite - отваряне на файл за редактиране (четене и запис).
  • Правата, с които ще се отваря файлът. Тук можете да посочите една от следните стойности (или можете да не посочите нищо):
  • fmshareCompat - с тези права правата за работа с отворения файл имат и други приложения;
  • fmShareExciusive - други приложения няма да могат да отворят файла;
  • fmShareDenyWrite - в този режим други приложения няма да могат да отворят този файл за запис. Файлът може да бъде отворен само за четене;
  • fmshareDenyRead - в този режим други приложения няма да могат да отворят този файл за четене. Файлът може да бъде отворен само за запис;
  • fmShareDenyNone - Не пречи на други приложения да работят с файла.
  • С първите два параметъра всичко е ясно. Но защо се нуждаем от разрешения за файлове. Да приемем, че отваряте файл за писане. След това друго приложение го отвори и също за запис. И двете програми записаха някои данни. След това вашето приложение затвори файла и запази всички промени. Веднага друго приложение презаписва вашите промени, без дори да знае, че те вече са преминали. Ето как вашата информация изчезва от файла, защото друга програма просто я е презаписала.

    Ако пишете програма за един потребител и само едно приложение ще има достъп до файла, тогава можете да забравите за правата и да не ги посочвате.

    След като сте работили с файла,просто извикайте метода Free, за да го затворите:

    Сега нека се запознаем с методите за четене, запис и вътрешната структура на файла. Да започнем със структурата. Когато отворите файл, позицията на курсора е зададена в самото начало и всеки опит за четене или запис ще се извърши в тази позиция на курсора. Ако трябва да четете или пишете на друга позиция, трябва да преместите курсора. Има метод за търсене за това. Има две опции:

    • Число, указващо позицията, към която да отидете. Ако трябва да преместите 5 байта, просто поставете числото 5.
    • Откъде трябва да се преместите. Тук има три опции:
    • soFromBeginning - преместване на посочения брой байтове от началото на файла.
    • soFromCurrent - преместване на посочения брой байтове от текущата позиция във файла до края на файла.
    • soFromEnd - преместване от края на файла към началото с указания брой байтове.

    Не забравяйте, че 1 байт е един символ. Единственото изключение са Unicode файловете. При тях един знак заема 2 байта. Следователно е необходимо да се вземе предвид под каква форма се съхранява информацията във файла.

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

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

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

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

    За да прочетете от файл, използвайте метода Read. Отново този метод има два параметъра:

    • променлива, в която ще бъде записан резултатът от четенето;
    • броя байтове за четене.

    Нека да разгледаме кода за четене от файл, започвайки от позиция 15. Можете да видите този код в списъка.

    f:TFileStream; // Променлива от тип обект

    //В следващия ред отварям filename.txt за четене и запис,

    f:= TFileStream.Create(1 c:\filename.txt', fmOpenReadWrite);

    f.Seek(15, soFromCurrent); // Преместване напред с 15 знака,

    f.Read(buf, 10); // Прочетете 10 знака от зададена позиция.

    е. Безплатно; // Унищожаване на обекта и съответно затваряне на файла, край;

    Моля, обърнете внимание, че в методаseek движението се извършва с 15 знака не от началото, а от текущата позиция, въпреки че е необходимо от самото начало. Това е така, защото след отваряне на файла текущата позиция е началото. Но е по-добре да не разчитате на това.

    Има само два случая, в които тези числа се различават:

    • по време на четене беше достигнат краят на файла и по-нататъшното четене стана невъзможно;
    • дискова грешка или друг проблем.

    Остава само да се справим със записа. За да направим това, ще използваме метода за запис. Освен това има две опции:

    • променливата, чието съдържание трябва да бъде записано;
    • брой байтове за запис.

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

    Засега няма да разглеждаме пример, защото по принцип всичко е ясно. И ако има въпроси, тогава на практика ще консолидираме този материал буквално в един или два раздела, когато работим със структури.