Давным-давно в тридесятом королевстве...
Короче, сделал и забыл:
Код: Выделить всё
! 1. идентификаторы доступа к файлу
GENERIC_READ EQUATE(80000000h)
GENERIC_WRITE EQUATE(40000000h)
GENERIC_EXECUTE EQUATE(20000000h)
GENERIC_ALL EQUATE(10000000h)
! 2. цели вызова функции CreateFile()
CREATE_NEW Equate(1) ! создать новый, если не существует (при существ. НЕ СРАБОТАЕТ-ошибка с кодом 80)
CREATE_ALWAYS Equate(2) ! создавать новый всегда (при существ. СРАБОТАЕТ-ошибка с кодом 183)
OPEN_EXISTING Equate(3) ! открыть существующий (при отсутств.НЕ СРАБОТАЕТ-ошибка с кодом 2)
OPEN_ALWAYS Equate(4) ! открыть всегда (при существ. СРАБОТАЕТ-ошибка с кодом 183)
! (при отсутств.СОЗДАЁТ -ошибка с кодом 0)
TRUNCATE_EXISTING Equate(5) ! открыть и усечь (треб.GENERIC_WRITE) (при отсутств.НЕ СРАБОТАЕТ-ошибка с кодом 2)
! 3. атрибуты файлов
FILE_ATTRIBUTE_READONLY EQUATE(00000001h)
FILE_ATTRIBUTE_HIDDEN EQUATE(00000002h)
FILE_ATTRIBUTE_SYSTEM EQUATE(00000004h)
FILE_ATTRIBUTE_ARCHIVE EQUATE(00000020h)
FILE_ATTRIBUTE_NORMAL EQUATE(00000080h)
FILE_ATTRIBUTE_TEMPORARY EQUATE(00000100h) ! временный
FILE_ATTRIBUTE_OFFLINE EQUATE(00001000h) ! данные немедленно недоступны (в дальнем хранилище)
FILE_ATTRIBUTE_ENCRYPTED EQUATE(00004000h)
! 4. идентификаторы разрешений совместного доступа к файлу
FILE_SHARE_NONE Equate(0)
FILE_SHARE_READ Equate(1)
FILE_SHARE_WRITE Equate(2)
FILE_SHARE_DELETE Equate(4)
FILE_SHARE_BOTH Equate(FILE_SHARE_READ + FILE_SHARE_WRITE)
FILE_SHARE_ALL Equate(FILE_SHARE_BOTH + FILE_SHARE_DELETE)
! 5. плохой Handle
INVALID_HANDLE_VALUE Equate(0FFFFFFFFh)
FILETIME Group,Type ! "файловое время"
dwLowDateTime ULong
dwHighDateTime ULong
End
SYSTEMTIME Group,Type ! "системное время"
wYear Word ! год
wMonth Word ! месяц
wDayOfWeek Word ! день недели
wDay Word ! число
wHour Word ! час
wMinute Word ! минута
wSecond Word ! секунда
wMilliseconds Word ! миллисекунда
End
MAP
MODULE('Windows.DLL')
CreateFile(*CString lpFileName, ULONG dwDesiredAccess, ULONG dwShareMode, |
ULONG Addr_SecurityAttributes=0, ULONG dwCreationDisposition, ULONG dwFlagsAndAttributes, |
UnSigned hTemplateFile=0),UnSigned, PASCAL,RAW,Name('CreateFileA'),DLL(TRUE)
GetFileSize(UnSigned hFile, ULONG Addr_FileSizeHigh=0),ULONG, PASCAL,RAW,DLL(TRUE)
GetFileTime(UnSigned hFile, *FILETIME lpCreationTime, |
ULong lpLastAccessTime=0, |
ULong lpLastWriteTime=0),BOOL, PASCAL,RAW,DLL(TRUE),proc
FileTimeToSystemTime(*FILETIME lpFileTime, *SYSTEMTIME lpSystemTime), BOOL, PASCAL,RAW,DLL(TRUE),proc
CloseHandle(UnSigned Handle), BOOL, Raw,Pascal,DLL(TRUE), Proc
END
FileFound_LenDate(String FullNameOfFileWithExt, <*ULong Bytes>, <*Long CreationDate>), Byte, Name('FileFound_LenDate@WMZapara')
END
!*****************************************************************************************
FileFound_LenDate FUNCTION (String FullNameOfFileWithExt, <*ULong Bytes>, <*Long CreationDate>) !, Byte
ret Byte(FALSE)
hFile UnSigned
lpcFileName CString(256)
CreationDateTime Group(FILETIME).
FileSystemTime Group(SYSTEMTIME).
!*****************************************************************************************
CODE
lpcFileName = FullNameOfFileWithExt
hFile = CreateFile(lpcFileName, GENERIC_READ, FILE_SHARE_BOTH, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL)
If hFile <> INVALID_HANDLE_VALUE Then ! Нет ошибки
ret += 1
If ~Omitted(2) Then Bytes = GetFileSize(hFile).
If ~Omitted(3) Then
GetFileTime(hFile, CreationDateTime)
FileTimeToSystemTime(CreationDateTime, FileSystemTime)
CreationDate = Date(FileSystemTime.wMonth, FileSystemTime.wDay, FileSystemTime.wYear)
End
CloseHandle(hFile)
Else
If ~Omitted(2) Then Clear(Bytes).
If ~Omitted(3) Then Clear(CreationDate).
End
Return(ret)
!*** End Of FoundFile ********************************************************************
Работает идеально, если нет запрета в NTFS на открытие файла
Заодно может возвращать длину файла и дату создания
P.S. ничего менять не нужно. "лишние" константы - даны для общего развития
