В течении нескольких статей я познакомлю тебя с основными функциями WinApi. Не пугайся, в этом нет ничего сложного. Я сам когда первый раз услышал про WinApi (Delphi я изучаю с октября 2007 года) перепугался до полного ужаса и стал параноиком, на неделю=) Шучу... WinApi - это всеголиш набор библиотечных функций виндовс. В статьях я буду приводить примеры на дельфи и на C++... C++ я знаю слабо, но все же для любителей именно этого языка программирования, я нашел помучал гугл малехо=)
Итак... преступим...
------------->
Первая функция, с которой я хочу вас познакомить CopyFile...
Она копирует файл в новое место, при этом старый файл не затирает...
Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.
Для С/С++
BOOL CopyFile(
LPCTSTR lpExistingFileName, // Указатель на файл, который надо копировать
LPCTSTR lpNewFileName, // Указатель на имя файла, куда надо копировать
BOOL bFailIfExists // Чё делать если файл уже существует.
);
Для Delphi
function CopyFile(
lpExistingFileName, // Указатель на файл, который надо копировать
lpNewFileName: PChar; // Указатель на имя файла, куда надо копировать
bFailIfExists: BOOL // Чё делать если файл уже существует.
): BOOL; stdcall;
Первый и второй параметр содержат полные имена к файлам. Третий параматр указывает, что нужно делать, если файл уже существует. Если он равен TRUE, то произойдёт ошибка, если FALSE, то существующий файл будет перезаписан.
Вот сразу примерчик на дельфи:
CopyFile('test1.txt', 'c:text1.txt', false); - если не указать путь к файлу, то он будет искаться в директории в которой находиться программа... Если все пучком то функция вернет true иначе false
<-------------
------------->
Следующая CreateDirectory
Для С/С++ объявлена в winbase.h. Для Delphi в модуле windows.
Для С/С++
BOOL CreateDirectory(
LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории
LPSECURITY_ATTRIBUTES lpSecurityAttributes // Указатель на атрибуты
);
Для Delphi
function CreateDirectory(
lpPathName: PChar; // Указатель на строку содержащую путь к новой директории
lpSecurityAttributes: PSecurityAttributes // Указатель на атрибуты
): BOOL; stdcall;
Если все нормально, то функция вернет true
<-------------
------------->
Есть еще одна функция, которая расширяет возможности предыдущей CreateDirectoryEx
Для С/С++
BOOL CreateDirectoryEx(
LPCTSTR lpTemplateDirectory,// Указатель на директорию-шаблон
LPCTSTR lpPathName, // Указатель на строку содержащую путь к новой директории
LPSECURITY_ATTRIBUTES lpSecurityAttributes // Указатель на атрибуты
);
Для Delphi
function CreateDirectoryEx(
lpPathName: PChar; // Указатель на строку содержащую путь к шаблону
lpPathName: PChar; // Указатель на строку содержащую путь к новой директории
lpSecurityAttributes: PSecurityAttributes // Указатель на атрибуты
): BOOL; stdcall;
Возвращает true при успешном исходе)
<-------------
------------->
Следующая функция CreateFile
Функция создаёт указатель на новое устройство типа:
Файл
Канал
mailslot (почтовый канал)
комуникационный ресурс (например COM порт)
дисковые устройства (только для Windows NT)
консоли
директории (открывает их)
Функция умеет открывать и создавать новые файлы.
Для С/С++
HANDLE CreateFile(
LPCTSTR lpFileName, // Указатель на имя файла (устройства)
DWORD dwDesiredAccess, //Параметры доступа
DWORD dwShareMode, //Разделяемый доступ
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //безопасность
DWORD dwCreationDistribution,// Описание
DWORD dwFlagsAndAttributes, // Атрибуты файла
HANDLE hTemplateFile // Файл шаблона
);
Для Delphi
function CreateFile(
lpFileName: PChar; // Указатель на имя файла (устройства)
dwDesiredAccess, //Параметры доступа
dwShareMode: DWORD; //Разделяемый доступ
lpSecurityAttributes: PSecurityAttributes; //безопасность
dwCreationDisposition, // Описание
dwFlagsAndAttributes: DWORD; // Атрибуты файла
hTemplateFile: THandle // Файл шаблона
): THandle; stdcall;
Функция не легкая, поэтому тут я подробно распишу все параметры
lpFileName - Указатель на строку содержащую имя создаваемого файла или устройства.
dwDesiredAccess - тип доступа. Может принимать значения (можно использовать одно или сразу несколько):
GENERIC_READ - получить доступ к чтению
GENERIC_WRITE - получить доступ к записи
dwShareMode - флаги, указывающие на то, как создаваемый (открываемый) объект должен разделять достум между процессами. Это значит, как будет делится доступ к файлу с другими прогами если они тоже попытаются открыть этот файл. Параметр может принимать значения (можно использовать одно или сразу несколько):
FILE_SHARE_DELETE - другим процессам разрешается доступ к файла (устройству) только если требуется доступ на удаление (поддерживается только в Windows NT).
FILE_SHARE_READ - другим процессам разрешается только читать файл
FILE_SHARE_WRITE - другим процессам разрешается только писать в файл
lpSecurityAttributes - указатель на структуру типа SECURITY_ATTRIBUTES. Этот параметр используется только в Windows NT, в Win9x он игнорируется.
dwCreationDistribution - описывает, что делать с файлом если он уже существует или его ещё нет. Параметр может принимать только одно из следующих значений (комбинация недопускается):
CREATE_NEW - создать новый файл. Если он уже существует, то произойдёт ошибка
CREATE_ALWAYS - а я сказал создать новый файл. Если файл существует, то он будет перезаписан (обнулён).
OPEN_EXISTING - открыть существующий файл (устройство). Если файла нет, то произойдёт ошибка.
OPEN_ALWAYS - а я сказал открыть файл. Если файла нет, то он будет создан как при использовании CREATE_NEW.
TRUNCATE_EXISTING - открыть файл и обрезать его размер до нуля. Параметр dwDesiredAccess должен содержать GENERIC_WRITE. Если файла нет, то произойдёт ошибка.
dwFlagsAndAttributes - атрибуты создаваемого файла. Параметр может принимать комбинацию из значений:
FILE_ATTRIBUTE_NORMAL
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_NO_BUFFERING - нельзя использовать буферы или кэш
FILE_FLAG_RANDOM_ACCESS - случайный доступ. Используется для оптимизации кэша
FILE_FLAG_SEQUENTIAL_SCAN - доступ к файлу может быть последовательный от начала до конца
FILE_FLAG_DELETE_ON_CLOSE - операционная система должна удалить файл, когда все указатели на файл будут закрыты
FILE_FLAG_BACKUP_SEMANTICS - Backup файл, т.е. файл резервного копирования.
FILE_FLAG_POSIX_SEMANTICS - доступ осуществляется в POSIX стандарте.
SECURITY_SQOS_PRESENT
SECURITY_ANONYMOUS - анонимный доступ
SECURITY_IDENTIFICATION - идентификационный доступ
SECURITY_IMPERSONATION - персональный доступ
SECURITY_DELEGATION - колективный доступ
SECURITY_CONTEXT_TRACKING - динамический режим доступа
SECURITY_EFFECTIVE_ONLY - ограничение груп и привелегий
hTemplateFile - файл шаблона
Если функция выполнилась без проблем, то она возвращает указатель на открытое (созданное) устройства. Через этот указатель ты получаешь доступ к файлу.
Если произошла ошибка, то функция вернёт INVALID_HANDLE_VALUE.
<-------------
------------->
Следующая функция простенькая, но её часто используют всякие там червячки(лично в основе моего первого червяка лежала именно эта функция DeleteFile =)))
Для С/С++
BOOL DeleteFile(
LPCTSTR lpFileName // Указатель на строку с полным именем файла
);
Для Delphi
function DeleteFile(
lpFileName: PChar// Указатель на строку с полным именем файла
): BOOL; stdcall;
Если всё ничтяк, то функция вернёт TRUE
<-------------
------------->
Следующий набор функция достаточно сложновати предназначен он для поиска определенных файлов на венике пользователя (эти функции тоже использовались в моем первом червячке)))
FindFirstFile
Функция запускает поиск файла в указанной директории.
Для С/С++
HANDLE FindFirstFile(
LPCTSTR lpFileName, // Строка содержащая путь для поиска файлов.
LPWIN32_FIND_DATA lpFindFileData // Информация о файле
);
Для Delphi
function FindFirstFile(
lpFileName: PChar; // Строка содержащая путь для поиска файлов.
var lpFindFileData: TWIN32FindData // Информация о файле
): THandle; stdcall;
Я предлагаю рассмотреть параметры подробнее
lpFileName - строка содержащая путь для поиска файла. Эта строка может указывать наконкретный файл типа 'c:filename.txt' или может хранить шаблон 'c:*.txt'. Если ты указываешь шаблон, то это даёт возможность перечислить все файлы удовлетворяющие шаблону.
lpFindFileData - структура WIN32_FIND_DATA, в которую будет записана инфа о найденом файле.
Расмотрим структуру WIN32_FIND_DATA немного подробнее:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; // Атрибуты файла
FILETIME ftCreationTime; // Время создания
FILETIME ftLastAccessTime; //Время последнего доступа
FILETIME ftLastWriteTime; //Время последней записи в файл
DWORD nFileSizeHigh; //Верхний байт размера файла
DWORD nFileSizeLow; //Нижний байт размера файла
DWORD dwReserved0; //Зарезервировано
DWORD dwReserved1; //Зарезервировано
TCHAR cFileName[ MAX_PATH ]; //Имя файла
TCHAR cAlternateFileName[ 14 ]; //Имя файла для отображения в DOS (8:3)
} WIN32_FIND_DATA;
Атрибутами файла может быть комбинация из флагов:
FILE_ATTRIBUTE_ARCHIVE - архивный
FILE_ATTRIBUTE_COMPRESSED - сжатый
FILE_ATTRIBUTE_HIDDEN - скрытый
FILE_ATTRIBUTE_NORMAL - нормальный
FILE_ATTRIBUTE_OFFLINE - данные файла недоступны
FILE_ATTRIBUTE_READONLY - только для чтения
FILE_ATTRIBUTE_SYSTEM - системный
FILE_ATTRIBUTE_TEMPORARY - временный
Размер файла разложен на два байта. Чтоб получить полный размер файла нужно выполнить действие (FInfo.nFileSizeHigh * MAXDWORD) + FInfo.nFileSizeLow. Это не самый эффективный (эффективнее сдвигать), но самый понятный способ.
Функция возвращает указатель на найденный файл, если нет то возврат будет типа ERROR_NO_MORE_FILES.
<-------------
------------->
Следующая функция опять связана с поиском файлов на венике... Это FindNextFile
Она продолжает поиск начатый с помощью FindFirstFile.
Для С/С++
BOOL FindNextFile(
HANDLE hFindFile, // Указатель на файл из предыдущего поиска
LPWIN32_FIND_DATA lpFindFileData // Информация о файле
);
Для Delphi
function FindNextFile(
hFindFile: THandle; // Указатель на файл из предыдущего поиска
var lpFindFileData: TWIN32FindData // Информация о файле
): BOOL; stdcall;
Со вторым параметром всё ясно, он такой же, как и у FindFirstFile. А вот первый - это указатель на файл из предыдущего поиска. Он нужен, чтобы функция FindNextFile знала на каком файле ты остановил поиск и какой надо найти следующим. Немного позже мы расмотрим реальный пример, чтобы тебе стало понятнее.
Если всё ничтяк, то функция вернёт TRUE
<-------------
------------->
И завершающая функция для предыдущих двух FindClose
Функция завершает поиск файлов.
Для С/С++
BOOL FindClose(
HANDLE hFindFile // Указатель на последний найденный файл
);
Для Delphi
function FindClose(
hFindFile: THandle // Указатель на последний найденный файл
): BOOL; stdcall;
При не летальном исходе возвратит true
<-------------
Код:
И сразу небольшой примерчик, для использования первых трех функций
var
FileName: string;
FindHandle:THandle;
SearchRec:TWIN32FindData;
begin
try
FindHandle := FindFirstFile('c:*.*', SearchRec);
if SearchRec.FindHandle <> INVALID_HANDLE_VALUE then
repeat
FileName:=SearchRec.cFileName
until FindNextFile(FindHandle,SearchRec)=false;
finally
Windows.FindClose(FindHandle);
end;
end;
Впринципе ничего особо тяжкого, стоит лишь немного напрячь мозги(если таковы имеюццо=))
------------->
Следующая функция, с которой я тебя познакомлю будет GetCurrentDirectory
Она очень проста, и возвращает директорию, с которой работает твоя прога! Подчеркиваю "С которой", а не " В которой"
Для С/С++
DWORD GetCurrentDirectory(
DWORD nBufferLength, // Размер буфера, в котором будет храниться путь
LPTSTR lpBuffer // Сам буфер
);
Для Delphi
function GetCurrentDirectory(
nBufferLength: DWORD; // Размер буфера, в котором будет храниться путь
lpBuffer: PChar // Сам буфер
): DWORD; stdcall;
Если произошла ошибка, то функция вернёт 0. Если всё ничтяк, то она вернёт длину lpBuffer в котором хранится путь текущей директории.
<-------------
Пока на сегодня все... В этой статье в основном функции для работы с файлами, но ничего страшно - это знать надо, хорошему программисту... Вы спросите меня "А на кой фиг нужна эта самая WinApi?" для тех кто в танке я отвечу, что знание WinApi очень нужны, а еще с помощью WinApi можно писать программы маленького размера, именно так, мой первый червячек весил 14КБ))) Спешиал фор HackZona)
Автор poput4ik