.:: NAVIGATION::.

:: Главная

::Статьи

:: FAQ

:: Ссылки

:: Форум
:: Мой E-mail

Site Design By: rOOse

 

 

 

 

.::.:.::...:::Статьи :::...::.:.::.
         
.:: WinApi. Файловые функции ::.
Здесь описаны не все функции работы с файлами, заглядывайте почаще они будут добавляться.

AreFileApisANSI
CancelIO
CopyFile
CopyFileEx
CopyProgressRoutine
CreateDirectory
CreateDirectoryEx
CreateFile
CreateIoCompletionPort
DefineDosDevice
DeleteFile
FileIOCompletionRoutine
FindClose
FindCloseChangeNotification
FindFirstChangeNotification
FindFirstFile
FindFirstFileEx
FindNextChangeNotification
FindNextFile
FlushFileBuffers
GetBinaryType
GetCompressedFileSize
GetCurrentDirectory
GetDiskFreeSpace
GetDiskFreeSpaceEx
GetDriveType
GetFileAttributes
GetFileAttributesEx
GetFileInformationByHandle
GetFileSize
GetFileType
GetFullPathName
GetLogicalDrives
GetLogicalDriveStrings
GetQueuedCompletionStatus
GetShortPathName
GetTempFileName
GetTempPath
GetVolumeInformation
LockFile
LockFileEx
MoveFile
MoveFileEx
PostQueuedCompletionStatus
QueryDosDevice
ReadDirectoryChangesW
ReadFile
ReadFileEx
RemoveDirectory
SearchPath
SetCurrentDirectory
SetEndOfFile
SetFileApisToANSI
SetFileApisToOEM
SetFileAttributes
SetFilePointer
SetVolumeLabel
UnlockFile
UnlockFileEx
WriteFile
WriteFileEx


Копировать файл:
function CopyFile( lpExistingFileName: PChar, lpNewFileName: PChar, bFailIfExists: LongBool);

lpExistingFileName указатель на имя файла
lpNewFileName указатель на новое имя файла
bFailIfExists если файл уже существует; если true то копирования не произойдет, если false то файл перезаписывается.

Например: CopyFile('D:\1.bmp','D:\form1.bmp',True);


Создать папку:


function CreateDirectory(lpPathName: PChar, lpSecurityAttributes: PSecurityAttributes:);

lpPathName указатель на имя папки
lpSecurityAttributes как в хэлпе пишется дескриптор безопасности для новой папки, только нам он не нужен можно смело ставить nil.

Например: CreateDirectory('D:\forms',nil);


Создать или открыть файл:

Функция создаёт указатель на новое устройство типа:

Файл
Канал
mailslot (почтовый канал)
комуникационный ресурс (например COM порт)
дисковые устройства (только для Windows NT)
консоли
директории (открывает их)
Функция умеет открывать и создавать новые устройства (файлы).

Объявление:

function CreateFile(
lpFileName: PChar; // Указатель на имя файла (устройства)
dwDesiredAccess, //Параметры доступа
dwShareMode: DWORD; //Разделяемый доступ
lpSecurityAttributes: PSecurityAttributes; //безопасность
dwCreationDisposition, // Описание
dwFlagsAndAttributes: DWORD; // Атрибуты файла
hTemplateFile: THandle // Файл шаблона
): THandle; stdcall;

Для Delphi есть ещё два варианта этой функции, которые отличаются только типом переменных. Эти функции имеют имена CreateFileA и CreateFileW. Я не буду их приводить, просто запомни, что в функциях с буквой А вконце все переменные типа PChar превращаются в AnsiChar, а с префиксом W переменные PChar превращаются в WideString.

В принципе, практически для всех API функций в Delphi доступно два дополнительных варианта, в которых действует описанное выше правило. Так что я больше не буду к этому возвращаться.

Теперь расмотрим подробненько все параметры:

lpFileName - Указатель на строку содержащую имя создаваемого файла или устройства.
dwDesiredAccess - тип доступа. Может принимать значения (можно использовать одно или сразу несколько):
0 - запрос. Функция не даст реального доступа к файлу, а выполнится как тест возможности создания или открытия файла (устройства).
   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.



Удалить файл:
function DeleteFile(lpFileName:PChar):boolean;

lpFileName указатель на имя файла

Например: DeleteFile('d:\fo.bmp');


Найти файл:

function FindFirstFile(lpFileName:PChar,varIpFileFindData:_WIN32_FIND_DATAA):Cardinal;
FindNextFile(hFindFile:Cardinal,var IpFileFindData:_WIN32_FIND_DATAA): LongBool;
FindClose(hFindFile:Cardinal):Boolean;

lpFileName указатель на имя файла
IpFileFindData указатель на структуру _WIN32_FIND_DATAA

Например:

procedure TForm1.Button2Click(Sender: TObject);
var SearhH:HWND;
FData:_WIN32_FIND_DATAA;
begin
SearhH:=FindFirstFile('D:\Музыка\*.mp3',FData);
listbox1.Items.Add(FData.cFileName);
if SearhH<>0 then begin
repeat
findnextfile(SearhH,FData);
listbox1.Items.Add(FData.cFileName );
until findnextfile(SearhH,FData)=false;
end;
FindClose(SearhH);
end;


Свободное место на диске:

function GetDiskFreeSpace(lpRootPathName:PChar, var lpSectorsPerCluster:Cardinal, var lpBytesPerSector:Cardinal, var lpNumberOfFreeClusters:Cardinal, var lpTotalNumberOfClusters:Cardinal):LongBool;

Параметры:

lpRootPathName Указатель на имя диска

lpSectorsPerCluster Указатель на количество секторов на кластер

lpBytesPerSector Указатель на количество байт на секторов

lpNumberOfFreeClusters Указатель на количество свободных секторов

lpTotalNumberOfClusters Указатель на общее количество секторов

Например:

procedure TForm1.Button1Click(Sender: TObject);
var FC,SPC,BPS,NC:DWORD;
begin
if GetDiskFreeSpace('C:\',SPC,BPS,FC,NC) then
Label1.Caption:='Свободнго места на диске '+IntToStr(SPC*FC*BPS)+' Байт';
end;


Определение типа диска:

function GetDriveType(lpRootPathName:PChar):Cardinal;

Прааметры:

lpRootPathName Указатель на имя диска

Например:

procedure TForm1.Button1Click(Sender: TObject);
var Drive:PChar;
begin
Drive:='F:\';
case GetDriveType(Drive) of
0:label1.Caption:='Тип дисковода не может быть определен.';
1:label1.Caption:='Такого диска не существует.';
2:label1.Caption:='Floppy или Zip дисковод.';
3:label1.Caption:='Это жесткий диск.';
4:label1.Caption:='Сетевой диск.';
5:label1.Caption:='Дисковод CD-ROM.';
6:label1.Caption:='Дисковод RАМ.';
end;
end;


Получить атрибуты файла:

function GetFileAttributes(lpFileName:PChar):Cardinal;

Параметры:

lpFileName указатель на имя файла

Например:

procedure TForm1.Button1Click(Sender: TObject);
begin
case GetFileAttributes('d:\blood.exe') of
1:label1.Caption:='Только для чтения';
2:label1.Caption:='Скрытый';
3:label1.Caption:='Только для чтения и Скрытый';
32:label1.Caption:='Архивный';
33:label1.Caption:='Только для чтения и Архивный';
34:label1.Caption:='Архивный и Скрытый';
35:label1.Caption:='Только для чтения и Архивный и Скрытый';
end;

end;


Перемещение файла:

function MoveFile(lpExistingFileName:PChar, lpNewFileName:PChar):LongBool;

Параметры:

lpExistingFileName указатель на имя файла

lpNewFileName указатель на новое имя файла

Например:

MoveFile('d:\blood.exe','c:\program files\blood.exe');


Удаление папки:

function RemoveDirectory(lpPathName:PChar):LongBool;

Параметры:

lpPathName указатель на имя папки

Например:

RemoveDirectory('d:\Games')

Примечание: Удаляет только пустые папки.



Установить текущую папку:

function SetCurrentDirectory(lpPathName:PChar);

Параметры:

lpPathName указатель на имя папки

Например: SetCurrentDirectory('d:\bonus');


Установить аттрибуты файла:
function SetFileAttributes(lpFileName:PChar, dwFileAttributes:Cardinal):LongBool;

Параметры:
lpFileName указатель на имя файла

dwFileAttributes Аттрибут файла
Может иметь значение:
FILE_ATTRIBUTE_ARCHIVE Архивный
FILE_ATTRIBUTE_HIDDEN Скрытый
FILE_ATTRIBUTE_NORMAL Без аттрибутов
FILE_ATTRIBUTE_OFFLINE Как написано в хелпе: Указывает, что файловые данные физически перемещены на offline память. 8-[
FILE_ATTRIBUTE_READONLY Только чтение
FILE_ATTRIBUTE_SYSTEM Системный
FILE_ATTRIBUTE_TEMPORARY Временный файл

Например: SetFileAttributes('d:\blood.exe',FILE_ATTRIBUTE_HIDDEN);На вверх


Получить размер файла:
function GetFileSize(hfile:Cardinal; lpFileSizeHigh:Pointer):Cardinal;

Параметры:
hfile Хэндл файла. Хэндл создается функцией CreateFile.
lpFileSizeHug Указатель на переменную которая будет содержать старший байт размера файла. Кажется что-то вроде этого ;-) Я ставил 0 все работает.

Например:

procedure TForm1.Button1Click(Sender: TObject);
var hfile: HWND;
dw: Pointer;
begin
    hfile:=CreateFile('C:\Image.bmp' ,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
    Label1.Caption:=IntToStr(GetFileSize(hfile,0) div     1024)+','+(IntToStr(GetFileSize(hfile,0) mod 1024))+' КБайт';
end; На вверх


 

Получить тип файла:
function GetFileType(hfile:Cardinal):Cardinal;

Параметры:
hfile Хэндл файла. Хэндл создается функцией CreateFile.

Если функция возвращает:
0 то тип файла не изестный (FILE_TYPE_UNKNOWN )
1 обычный файл(дисковый) (FILE_TYPE_DISK)
2 символьный файл, обычно LPT порт или Консоль (FILE_TYPE_CHAR )
3 Поименованный канал(PIPE) (FILE_TYPE_PIPE )

Например:
procedure TForm1.Button1Click(Sender: TObject);
var hfile:hwnd;
dw:pointer;
begin
hfile:=createfile('C:\Image.bmp' ,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
label1.Caption:=inttostr(GetFileType(hfile));
end;На вверх


Получить информацию о диске(имя тома, файловая система):

GetVolumeInformation(
lpRootPathName: PChar,
lpVolumeNameBuffer: PChar,
nVolumeNameSize: Cardinal,
lpVolumeSerialNumber: PDWORD,
lpMaximumComponentLength: Cardinal,
lpFileSystemFlags: Cardinal,
lpFileSystemNameBuffer: PChar,
nFileSystemNameSize:Cardinal
):Lo;

Параметры:

lpRootPathName ........................Имя диска
lpVolumeNameBuffer ................Указатель на имя тома
nVolumeNameSize ....................Длина lpVolumeNameBuffer
lpVolumeSerialNumber .............Указатель на серийный номер тома
lpMaximumComponentLength ..Максимальная длина имени файла в системе
lpFileSystemFlags ....................Системные флаги
lpFileSystemNameBuffer ..........Название файловой системы
nFileSystemNameSize ..............Длина lpFileSystemNameBuffer

Например:

procedure TForm1.DriveComboBox1Change(Sender: TObject);
var
VolName: array [0..255] of char;
FSName : array [0..100] of char;
VolSN: PDWORD;
MaxCompLen,FSFlags: Cardinal;
FC,SPC,BPS,NC:DWORD;
s: string;
begin
VolSN:=nil;
s:=UpperCase(DriveComboBox1.Drive)+':\';
Label1.Caption:=s;
if (GetVolumeInformation(PChar(s),VolName,255,
VolSN, MaxCompLen, FSFlags,FSName,100)) then
begin
Label2.Caption:='Имя тома: '+AnsiString(VolName);
Label3.Caption:='Файловая система: '+AnsiString(FSName) ;
end
else
begin
Label2.Caption:='Диск не готов';
Label3.Caption:='';
end;
end;На вверх


Прочитать из файла:

function ReadFile(hfile:Cardinal,
var Buffer:Untyped,
nNumberOfBytesToRead:Cardinal,
lpNumberOfBytesRead:Cardinal,
lpOverlapped:POverlapped):LongBool;

Параметры:

hfile....................................Хэндл читаемого файла Хэндл создается функцией CreateFile.
Buffer.................................Прочитанная информация
nNumberOfBytesToRead....Число читаемых байтов.
lpNumberOfBytesRead.......Указатель на на nNumberOfBytesToRead
lpOverlapped......................Указатель на структуру Overlapped мона ставить 0.

Например:

procedure TForm1.Button1Click(Sender: TObject);
var hf:hwnd;
buff:array[0..15]of char;
dwBytesRead:dword;
begin
hf:=CreateFile('d:\delphi.txt',
GENERIC_REad,
0,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);

ReadFile(hF, buff, 15, dwBytesRead, nil);
label1.Caption:=buff;
end;На вверх


Установить позицию чтения/записи в конец файла:

function SetEndOfFile(hfile:Cardinal):Cardinal;

Параметры:

hfile...............Хэндл файла.

Примера нема, думаю все понятно как ее использовать.На вверх


Писать в файл:

function WriteFile(hfile:Cardinal,
var Buffer:Untyped,
nNumberOfBytesToWrite:Cardinal,
lpNumberOfBytesWritten:Cardinal,
lpOverlapped:POverlapped):LongBool;

Параметры:

hfile....................................Хэндл читаемого файла Хэндл создается функцией CreateFile.
Buffer.................................Прочитанная информация
nNumberOfBytesToWrite....Число читаемых байтов.
lpNumberOfBytesWritten.......Указатель на на nNumberOfBytesToRead
lpOverlapped......................Указатель на структуру Overlapped мона ставить 0.

Например:

procedure TForm1.Button1Click(Sender: TObject);
var hf:hwnd;
buff:array[0..2]of char;
nobw:dword;
begin
hf:=CreateFile('d:\delphi.txt',
GENERIC_WRITE,
0,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
buff:='Ok';
Writefile(hf,buff,2,nobw,nil);
end; На вверх

 
   

 

 

 

Hosted by uCoz