작업 종료됨
명시
Требуется написать советник (код с комментариями) для MQL4, который будет перезаписывать файл вне каталога терминала.
Пример:
Допустим существует каталог с файлом вне песочницы: "D:\files\DATA.txt".
В нем записано значение "0". Типа int. Других значений не будет и дополнений не будет.
Нужно написать код, который будет в данный файл записывать значение int - "1".
Всё.
Пытался написать функцию, которая записывает файл в каталог указан пользователем (работаем вне песочницы).
Написал код с помощью библиотеки "ZI_File_Functions_Full_Lib" https://www.mql5.com/ru/code/8577
Функция " PathFunctions.dll." https://www.mql5.com/ru/code/10873 не подходит т.к. работает с Vista, у меня Windows 7.
Все лишнее удалил т.к. чтение не нужно, просто берем каталог и там создаем (заменяем) файл со значением, которое изначально известно, всё.
//=============================================================================================================================================================== // Импортируемые функции. //=============================================================================================================================================================== #import "ntdll.dll" int RtlGetLastWin32Error(); int RtlSetLastWin32Error (int dwErrCode); #import #include <WinKernel32.mqh> // Заголовочный файл библиотеки "kernel32.dll" функций API Windows XP. //=============================================================================================================================================================== // Объявленные константы. //=============================================================================================================================================================== #define FILE_FULL_CREATE 0 // Создать или переписать файл. //=============================================================================================================================================================== // Функция открывает или создаёт файл. // Функция открывает/создает файл для ввода и/или вывода. Если при открытии для записи файла нет, то он будет создан. Для создания директории // используется функция "CreateDirectory()". Функция возвращает: handle - файловый описатель, если функция выполнилась без ошибки; // -1 - возникла системная ошибка; // -2 - ошибка при перемещении файлового указателя в конец файла; // -3 - указан недопустимый способ открытия файла. //=============================================================================================================================================================== int start(){ int FileOpenFull (string PathName="D:\files\DATA.csv", // Имя файла с абсолютным путём. int ModeCWR=0) // Способ открытия файла: 0 - FILE_FULL_CREATE Открытие файла для записи. Если файл существует, то содержимое файла будет // уничтожено. Если файл с таким именем не существует, то будет создан новый. { int Error; // Номер последней ошибки. int Handle; // Файловый описатель. //=============================================================================================================================================================== RtlSetLastWin32Error(0); // Обнуляем ошибку. if (ModeCWR != FILE_FULL_READ) // Если функция вызвана не для чтения, проверяем на наличие файла. { // Проверяем на наличие файла. Читаем файл. Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (RtlGetLastWin32Error() == 2 && Handle == -1) ModeCWR = FILE_FULL_CREATE; // Файла нет. Создаём файл. else { if (!CloseHandle (Handle)) { Error = RtlGetLastWin32Error(); Print ("Ошибка в функции \"FileOpenFull()\". Файл с путём \"", PathName, "\" не закрыт при проверки на наличие. Последняя ошибка: \"", Error, "\". ", StringError (Error)); return (-1); } } RtlSetLastWin32Error(0); // Обнуляем ошибку. } //=============================================================================================================================================================== // Переключатель по способам открытия файла. //=============================================================================================================================================================== switch (ModeCWR) { // Создаём файл. case FILE_FULL_CREATE: { Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (Handle == -1) { Error = RtlGetLastWin32Error(); Print ("Ошибка в функции \"FileOpenFull()\". Файл с путём \"", PathName, "\" не открыт. Последняя ошибка: \"", Error, "\". ", StringError (Error)); } return (Handle); } //=============================================================================================================================================================== // Функция закрытия файла. // Функция закрывает ранее открытый файл. Если файл закрыт успешно, функция возвращает TRUE, иначе возвращает FALSE. //=============================================================================================================================================================== bool FileCloseFull (int Handle) // Файловый описатель, возвращаемый функцией "FileOpenFull()". { int Error; // Номер последней ошибки. //---- RtlSetLastWin32Error (0); if (!CloseHandle (Handle)) { Error = RtlGetLastWin32Error(); Print ("Ошибка в функции \"FileCloseFull()\". Последняя ошибка: \"", Error, "\". ", StringError (Error)); return (false); } else return (true); } //=============================================================================================================================================================== // Функция возвращает код системной ошибки. //=============================================================================================================================================================== int SystemError() { return (RtlGetLastWin32Error()); } //=============================================================================================================================================================== // Функция возвращает строковое описание кода системной ошибки. //=============================================================================================================================================================== string StringError (int ErrorCode) // Код системной ошибки. { int i; string String = ""; //---- int Buffer[128]; //---- ArrayInitialize (Buffer, 0); FormatMessageA (0x1000, 0, ErrorCode, 0, Buffer, ArraySize (Buffer), 0); //---- for (i = 0; i < ArraySize (Buffer); i++) { String = String + CharToStr (Buffer[i] & 0xFF) + CharToStr (Buffer[i] >> 8 & 0xFF) + CharToStr (Buffer[i] >> 16 & 0xFF) + CharToStr (Buffer[i] >> 24 & 0xFF); } return (StringTrimRight (String)); } //=============================================================================================================================================================== // Конец //===============================================================================================================================================================
}