//+------------------------------------------------------------------+ //| 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" #include "WinAPIErrorsDescription.mqh" //--- #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); int FindClose(int hFindFile); int FindClose(long hFindFile); /* CreateFileW Параметры lpFileName Имя файла или устройства, которое будет создано или открыто. Вы можете использовать либо косую черту (/), либо обратную косую черту () в этом имени. dwDesiredAccess Запрошенный доступ к файлу или устройству, который можно суммировать как чтение, запись, оба или.     Наиболее часто используемые значения: GENERIC_READ, GENERIC_WRITE или оба (GENERIC_READ|GENERIC_WRITE). dwShareMode Запрошенный режим совместного доступа к файлу или устройству, который можно читать, записывать, читать и записывать, удалять, любой из них (см. Следующую таблицу). Этот запрос не влияет на запросы доступа к атрибутам или расширенным атрибутам. 0 hex 0x00000000 Запрещает другим процессам открывать файл или устройство, если они запрашивают удаление, чтение или запись. FILE_SHARE_DELETE hex 0x00000004 Включает последующие операции открытого доступа к файлу или устройству для запроса доступа на удаление. FILE_SHARE_READ hex 0x00000001 Включает последующие операции открытого доступа к файлу или устройству для запроса доступа на чтение. FILE_SHARE_WRITE hex 0x00000002 Включает последующие операции открытого доступа к файлу или устройству для запроса доступа на запись. lpSecurityAttributes Указатель на структуру SECURITY_ATTRIBUTES, которая содержит два отдельных, но связанных элемента данных: необязательный дескриптор безопасности и логическое значение, определяющее, может ли возвращенный дескриптор наследоваться дочерними процессами. Этот параметр может быть NULL. dwCreationDisposition Действие, которое требуется для создания файла или устройства, которое существует или не существует. Для других устройств, кроме файлов, этот параметр обычно устанавливается на OPEN_EXISTING. CREATE_ALWAYS 2 Создает новый файл, всегда. Если указанный файл существует и доступен для записи, функция перезаписывает файл, функция успешно завершается, а код последней ошибки - ERROR_ALREADY_EXISTS (183). CREATE_NEW 1 Создает новый файл, только если он еще не существует. Если указанный файл существует, функция завершается с ошибкой, а код последней ошибки - ERROR_FILE_EXISTS (80). OPEN_ALWAYS 4 Открывает файл всегда. Если указанный файл существует, функция завершается успешно, а код последней ошибки - ERROR_ALREADY_EXISTS (183). OPEN_EXISTING 3 Открывает файл или устройство, только если он существует. Если указанный файл или устройство не существует, функция завершается с ошибкой, а код последней ошибки - ERROR_FILE_NOT_FOUND (2). TRUNCATE_EXISTING 5 Открывает файл и обрезает его так, что его размер равен нулю байтам, только если он существует. Если указанный файл не существует, функция завершается с ошибкой, а код последней ошибки - ERROR_FILE_NOT_FOUND (2). dwFlagsAndAttributes Атрибуты и флаги файла или устройства, FILE_ATTRIBUTE_NORMAL - наиболее распространенное значение по умолчанию для файлов. FILE_ATTRIBUTE_NORMAL dec 128 hex 0x80 У файла нет других атрибутов. Этот атрибут действителен только в том случае, если он используется один. FILE_ATTRIBUTE_READONLY dec 1 hex 0x1 Файл доступен только для чтения. Приложения могут читать файл, но не могут его записать или удалить. hTemplateFile Правильный дескриптор файла шаблона с правом доступа GENERIC_READ. Файл шаблона предоставляет атрибуты файлов и расширенные атрибуты для создаваемого файла. Этот параметр может быть NULL. Возвращаемое значение Если функция завершается успешно, возвращаемое значение является открытым дескриптором для указанного файла, устройства, именованного канала или почтового слота. Если функция не работает, возвращается значение INVALID_HANDLE_VALUE. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError. */ int CreateFileW( HANDLE CreateFileW(string lpFileName, LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); #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); } //+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+ //| CreateFileW function | //| https://docs.microsoft.com/ru-ru/windows/desktop/api/fileapi/nf-fileapi-createfilew | //| | //| | //| | //| | //| | //| | //| | //| | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+