Работа с файлами - открытие и закрытие (win api)
Итак, рассмотрим здесь функции открытия и закрытия файлов.
Для любых действий с файлом, сначала его необходимо открыть. Здесь я рассматриваю
win-api функции, поэтому для открытия файла можно использовать такие функции:
CreateFile(
lpFileName : PAnsiChar,
dwDesiredAccess : cardinal,
dwShareMode : cardinal,
lpSecurityAttributes : PSecurityAttributes,
dwCreationDistribution : cardinal,
dwFlagsAndAttributes : cardinal,
hTemplateFile : cardinal
) : cardinal;
Итак, функция CreateFile может и открывать файлы и создавать их (и не только файлы!).
lpFileName - имя файла - null-terminated строка (строка, признаком конца которой является символ с кодом 0). Я думаю тут
всё понятно, поэтому двигаемся далее.
dwDesiredAccess - доступ к файлу - для чтения или записи, допустимые значения:
GENERIC_READ - для чтения
GENERIC_WRITE - для записи
Однако флаги можно комбинировать, GENERIC_READ or GENERIC_WRITE - откроет файл для чтения-записи.
dwShareMode - доступ к файлу во время работы с ним программы. Если поставить 0, то никакая
другая программа не сможет открыть данный файл во время вашей раьоты с ним. Допустимые значения:
0 - описано выше
FILE_SHARE_DELETE (только windows nt) - можно ли удалить файл во время вашей работы с ним
FILE_SHARE_READ - можно ли его читать
FILE_SHARE_WRITE - возможна ли запись в файл, когда вы с ним работаете
lpSecurityAttributes - указатель на структуру SECURITY_ATTRIBUTES. Можно вбить просто nil.
dwCreationDistribution - флаги создания файла. Это очень интересный момент, остановимся на нём несколько подробнее.
Итак, если требуется создать файл, только если его ещё нет, тогда вбивай CREATE_NEW, если требуется создать файл,
при этом если файл с таким именем уже будет, то его перезаписать - вбивай CREATE_ALWAYS, если требуется открыть файл,
только если он есть (в случае отсутствия, функция вернёт ошибку), тогда вбивай OPEN_EXISTIG, однако
зачастую самым нужным оказывается значение OPEN_ALWAYS - тогда, если файл отсутствует, он будет создан, а если
он уже есть, тогда файл будет открыт.
dwFlagsAndAttributes - аттрибуты создаваемого файла, в случае если файл открывается, этот
параметр игнорируется. Доупустимые значения:
FILE_ATTRIBUTE_ARCHIVE - архивный
FILE_ATTRIBUTE_COMPRESSED - сжатый
FILE_ATTRIBUTE_HIDDEN - скрытый
FILE_ATTRIBUTE_NORMAL - нормальный (без аттрибутов)
FILE_ATTRIBUTE_OFFLINE - недоступен
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
FILE_FLAG_BACKUP_SEMANTICS
FILE_FLAG_POSIX_SEMANTICS
SECURITY_ANONYMOUS
SECURITY_IDENTIFICATION
SECURITY_DELEGATION
SECURITY_CONTEXT_TRACKING
SECURITY_EFFECTIVE_ONLY
hTemplateFile - "шаблон" для файла с GENERIC_READ флагом, обычно вбивается 0.
Это была первая функция, которая используется для открытия файла, теперь перейдём к следующей функции -
OpenFile(
lpFileName : PAnsiChar,
lpReOpenBuff : OFSTRUCT,
uStyle : Cardinal
) : hFile;
Функция OpenFile может открывать, удалять, ре-открывать, с помошью неё можно проверять - существует ли файл, в общем,
так же имеет массу полезных вещей в себе, начнём описание:
lpFileName - параметр указывает на имя файла - null-terminated строка
lpReOpenBuff - параметр указывает на структуру OFSTRUCT (от OpenFileSTRUCT)
uStyle - самое, собственно главное, в этом процессе - флаг открытия, вот список флагов + пояснения:
OF_CREATE - создаёт новый файл, если файл с таким именем уже есть, он будет перезаписан
OF_DELETE - удаляет файл
OF_EXIST - открывает и сразу же закрывает файл, используется для проверки, есть ли такой файл
OF_PARSE - заполняет структуру OFSTRUCT, переданную во втором параметре
OF_PROMPT - если файл не найден, появляется окно с уведомлением и кнопками "retry" и "cancel"
OF_READ - открывает только для чтения
OF_READWRITE - открывает для чтения-записи
OF_REOPEN - ре-открывает файл
OF_SHARE_COMPAT - открывает файл в MS-DOS-based файловых системых
OF_SHARE_DENY_NONE - открывает файл в MS-DOS-based файловых системых, при этом другим приложениям в доступе к файлу будет отказано
OF_SHARE_DENY_READ - открывает файл в MS-DOS-based файловых системых, при этом другие приложения смогут только записывать в открытый файл
OF_SHARE_DENY_WRITE - открывает файл в MS-DOS-based файловых системых, при этом другие приложения смогут только читать открытый файл
OF_SHARE_EXCLUSIVE - открывает файл в MS-DOS-based файловых системых, открывает read-write доступ к открываемому файлу
OF_VERIFY - проверяет, когда файл был открыт в последний раз, используется только в файлах с аттрибутом read-only
OF_WRITE - открытие файла только для записи
О, да! Наконец-то мы приступаем к кодингу, хватай примеры с пояснениями:
Листинг 1.0 - открытие файла с использованием CreateFile |
procedure TForm1.Button1Click(Sender: TObject);
var
fl : hFile;
begin
fl := CreateFile('cool.txt', // имя файла
GENERIC_READ or GENERIC_WRITE, // тип доступа к нему
FILE_SHARE_WRITE or FILE_SHARE_READ, // тип доступа для других приложений
nil, // указатель на структуру SECURITY_ATTRIBUTES - нафиг
OPEN_ALWAYS, // если файла нет, то создать и открыть
FILE_ATTRIBUTE_NORMAL, // обычный файл
0); //темплейт файла - нафиг
CloseHandle(fl);
end;
|
Итак, в примере, создаётся файл cool.txt. Потом файл сразу же закрывается. А вот закрывается
он функцией -
CloseHandle(
hObject : Cardinal
);
Её я ещё не описывал, но и описывать в ней собственно нечего - единственным параметром,
который ей передаётся, мы передаём обьект (дескриптор) который надо закрыть. В нашем
случае мы передаём ему дескриптор файла fl.
Идём далее - привожу пример, в котором файл создаётся функцией OpenFile.
Листинг 1.1 - открытие файла с использованием OpenFile |
procedure TForm1.Button1Click(Sender: TObject);
var
fl : hFile;
ofs : OFSTRUCT;
begin
fl := OpenFile('cool.txt',
ofs,
OF_CREATE or OF_WRITE);
CloseHandle(fl);
end;
|
В примере так же создаётся файл cool.txt, и при этом открывается для записи. Ну вот, собственно и всё, если нормально вник во всё -
читай следующий раздел.
SLAyer
Другие статьи
По всем вопросам и предложениям по сайту пишите на info@comp-info.ru  
|