-- "lfsfar" - fylesystem function for lua use ffi -- -- @file lfsfar.lua -- @brief Реализация функции filesystem: SetFileInformationByHandle(FILE_BASIC_INFO) local ffi = require "ffi" local _M = {} local lib = ffi.C if ffi.arch == 'x86' then ffi.cdef[[ typedef uint32_t UINT_PTR; ]] end if ffi.arch == 'x64' then ffi.cdef[[ typedef uint64_t UINT_PTR; ]] end ffi.cdef([[ typedef void VOID; typedef VOID *LPVOID; typedef long LONG; typedef unsigned long ULONG; typedef unsigned long DWORD; typedef UINT_PTR HANDLE; typedef int32_t BOOL; typedef uint32_t UINT; typedef int64_t LONGLONG; typedef struct _WINAPI_LARGE_INTEGER_s { ULONG LowPart; LONG HighPart; } WINAPI_LARGE_INTEGER_s; typedef union _LARGE_INTEGER { WINAPI_LARGE_INTEGER_s u; LONGLONG QuadPart; } LARGE_INTEGER; typedef struct _FILE_BASIC_INFO { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; DWORD FileAttributes; } FILE_BASIC_INFO; typedef UINT FILE_INFO_BY_HANDLE_CLASS; static const FILE_INFO_BY_HANDLE_CLASS FileBasicInfo = 0; BOOL SetFileInformationByHandle(HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize); int _fileno(struct FILE *stream); intptr_t _get_osfhandle(int fd); ]]) ----------------------------------------- -- file: FILE* -- times: table of tTimes -- tTimes is a table with the following predefined fields: -- LastWriteTime: number -- LastAccessTime: number -- CreationTime: number -- ChangeTime: number function _M.FarSetFileTime(file, times) local handle = lib._get_osfhandle(lib._fileno(file)) local bfi = ffi.new("FILE_BASIC_INFO") local size = ffi.sizeof(bfi) bfi.CreationTime.QuadPart = times.CreationTime * 1000 bfi.LastAccessTime.QuadPart = times.LastAccessTime * 1000 bfi.LastWriteTime.QuadPart = times.LastWriteTime * 1000 bfi.ChangeTime.QuadPart = times.ChangeTime * 1000 bfi.FileAttributes = 0 local bret = lib.SetFileInformationByHandle(handle, lib.FileBasicInfo, bfi, size) return bret end return _M