//+------------------------------------------------------------------+ //| WinAPI.mqh | //| Copyright © 2018, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.001" // константы для функции #define OF_READ 0 #define OF_WRITE 1 #define OF_READWRITE 2 #define OF_SHARE_COMPAT 3 #define OF_SHARE_DENY_NONE 4 #define OF_SHARE_DENY_READ 5 #define OF_SHARE_DENY_WRITE 6 #define OF_SHARE_EXCLUSIVE 7 #include "WinAPIErrorsDescription.mqh" //--- struct stFILETIME { long dwLowDateTime; long dwHighDateTime; }; stFILETIME FILETIME, *PFILETIME; struct stSYSTIME { int wYear; int wMonth; int wDayOfWeek; int wDay; int wHour; int wMinute; int wSecond; int wMilliseconds; }; stSYSTIME SYSTEMTIME, *PSYSTEMTIME; #import "kernel32.dll" int GetLastError(); /* CreateDirectoryW Параметры lpPathName [in] Путь папки, которая будет создана lpSecurityAttributes [in, optional] Ссылка на структуру описывающиую безопастность папки. Просто передаём "0". Возвращаемое значение Если функция завершается успешно, то возвращаемое значение не равно нулю. Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите функцию kernel32::GetLastError(). Возможные ошибки: ERROR_ALREADY_EXISTS ERROR_PATH_NOT_FOUND */ bool CreateDirectoryW(string &lpPathName,long lpSecurityAttributes=0); /* CopyFileW Параметры lpExistingFileName [in] Имя существующего файла. Здесь принудительно принято ограничение по длине имени — MAX_PATH символов, этого всегда хватит для нашего примера. Если файл с именем lpExistingFileName не существует, то функция терпит неудачу, и kernel32::GetLastError() возвращает ERROR_FILE_NOT_FOUND. lpNewFileName [in] Имя нового файла. Здесь принудительно принято ограничение по длине имени — MAX_PATH символов, этого всегда хватит для нашего примера. bFailIfExists [in] Если этот параметр true и новый файл, указанный в lpNewFileName существует, функция терпит неудачу. Если этот параметр false и новый файл существует, функция перепишет существующий файл и успешно завершит работу. Возвращаемое значение Если функция завершается успешно, то возвращаемое значение не равно нулю. Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить дополнительную информацию об ошибке, вызовите функцию kernel32::GetLastError(). Возможные ошибки: ERROR_FILE_NOT_FOUND */ int CopyFileW(string lpExistingFileName,string lpNewFileName,bool bFailIfExists); long CreateFileW(string lpFileName, long dwDesiredAccess, long dwShareMode, int lpSecurityAttributes, long dwCreationDisposition, long dwFlagsAndAttributes, long hTemplateFile ); //+----------------------------------------------------- //| LPCWSTR lpFileName, //| DWORD dwDesiredAccess, //| DWORD dwShareMode, //| LPSECURITY_ATTRIBUTES lpSecurityAttributes, //| DWORD dwCreationDisposition, //| DWORD dwFlagsAndAttributes, //| HANDLE hTemplateFile //| ); //+----------------------------------------------------- bool CloseHandle(long hFile); bool GetFileTime(long hFile, FILETIME &ftCreate, FILETIME &ftAccess, FILETIME &ftWrite); //bool FileTimeToSystemTime(FILETIME &ftWrite, SYSTEMTIME &stUTC); //bool SystemTimeToTzSpecificLocalTime(int TIME_ZONE=NULL, SYSTEMTIME &stUTC, SYSTEMTIME &stLocal); int FindClose(int hFindFile); int FindClose(long hFindFile); #import //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool WinAPI_FindClose(long hFindFile) { bool res; if(_IsX64) res=FindClose(hFindFile)!=0; else res=FindClose((int)hFindFile)!=0; if(!res) ErrorDescription(kernel32::GetLastError()); //--- return(res); } //+------------------------------------------------------------------+ //| CreateDirectory function | //| https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa363855(v=vs.85).aspx | //| Return code: | //| ERROR_ALREADY_EXISTS | //| 183 (0xB7) | //| Cannot create a file when that file already exists | //| ERROR_PATH_NOT_FOUND | //| 3 (0x3) | //| The system cannot find the path specified | //+------------------------------------------------------------------+ bool WinAPI_CreateDirectory(int &error,string &lpPathName,long null=0) { if(!CreateDirectoryW(lpPathName)) { error=kernel32::GetLastError(); ErrorDescription(error); return(false); } //--- return(true); } //+------------------------------------------------------------------+ //| CreateFileW function | //| https://docs.microsoft.com/ru-ru/windows/desktop/api/fileapi/nf-fileapi-createfilew | //| Return code: | //| HANDLE CreateFileW( //| LPCWSTR lpFileName, //| DWORD dwDesiredAccess, //| DWORD dwShareMode, //| LPSECURITY_ATTRIBUTES lpSecurityAttributes, //| DWORD dwCreationDisposition, //| DWORD dwFlagsAndAttributes, //| HANDLE hTemplateFile //| ); //+------------------------------------------------------------------------------------ //|DWORD dwShareMode, //|0 0x00000000 Запрещает другим процессам открывать файл или устройство, //| если они запрашивают доступ на удаление, чтение или запись. //|FILE_SHARE_DELETE 0x00000004 Включает последующие открытые операции над файлом или устройством //| для запроса удаления доступа. //| В противном случае, другие процессы не могут открыть файл или устройство, //| если они просят удалить доступ. //| Если этот флаг не указан, но файл или устройство было открыто //| для удаления доступа, функция неудачи. //| Примечание удаление позволяет удалять и переименовывать операции. //| //|FILE_SHARE_READ 0x00000001 Включает последующие открытые операции над файлом или устройством //| для запроса доступа на чтение. //| В противном случае другие процессы не смогут открыть файл или устройство, //| если они запросят доступ на чтение. //| Если этот флаг не указан, но файл или устройство было открыто //| для доступа на чтение, функция неудачи. //| //|FILE_SHARE_WRITE 0x00000002 Включает последующие открытые операции над файлом или устройством //| для запроса доступа на запись. //| В противном случае другие процессы не смогут открыть файл или устройство, //| если они запросят доступ на запись. //| Если этот флаг не указан, но файл или устройство было открыто //| для доступа на запись или имеет сопоставление файлов при доступе на запись //| функция завершается неудачей. //+------------------------------------------------------------------+ long WinAPI_GetHandleFileW (int &error,string lpPathName) { long hfile=CreateFileW(lpPathName, OF_READ, 0x00000000, NULL,3, 0, NULL); if(hfile==-1) { error=kernel32::GetLastError(); ErrorDescription(error); return(-1); } //--- return(hfile); } //+------------------------------------------------------------------+ //| CopyFile function | //| https://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx | //| Return code: | //| ERROR_FILE_NOT_FOUND | //| 2 (0x2) | //| The system cannot find the file specified | //| ERROR_FILE_EXISTS | //| 80 (0x50) | //| The file exists | //+------------------------------------------------------------------+ bool WinAPI_CopyFile(int &error,const string lpExistingFileName,const string lpNewFileName,bool bFailIfExists) { if(!CopyFileW(lpExistingFileName,lpNewFileName,bFailIfExists)) { error=kernel32::GetLastError(); ErrorDescription(error); return(false); } //--- return(true); } //+------------------------------------------------------------------+ //| WinAPI_CloseHandle(hFile); | //| BOOL WINAPI CloseHandle(_In_ HANDLE hObject); | //+------------------------------------------------------------------+ bool WinAPI_CloseHandle(long hFile) { bool res; if(_IsX64) res=CloseHandle(hFile)!=0; else res=CloseHandle((int)hFile)!=0; if(!res) ErrorDescription(kernel32::GetLastError()); //--- return(res); } //+------------------------------------------------------------------+ // WinAPI_GetLastWriteTime - Извлекает время последней записи и преобразует // время в строку // // Return value - TRUE if successful, FALSE otherwise // hFile - Правильный файловый handle // lpszString - ССылка на буфер для получения строки //+------------------------------------------------------------------+ string WinAPI_GetLastWriteTime(long hFile) { FILETIME ftCreate, ftAccess, ftWrite; SYSTEMTIME stUTC, stLocal; long dwRet,dwSize; string TimeString; // Извлечение значений времени из файла. if (!GetFileTime(hFile, ftCreate, ftAccess, ftWrite)) return false; /* // Convert the last-write time to local time. FileTimeToSystemTime(ftWrite, stUTC); SystemTimeToTzSpecificLocalTime(NULL, stUTC, stLocal); // Строим string показывающую the date and time. // dwRet = StringCchPrintf(TimeString, dwSize, // TEXT("%02d/%02d/%d %02d:%02d"), // stLocal.wMonth, stLocal.wDay, stLocal.wYear, // stLocal.wHour, stLocal.wMinute); // if( S_OK == dwRet ) // return TimeString; // else return ""; } */ }