Файловые операции в MQL4 без ограничений

 
Это более корректная версия чтения файла из любой папки, а не из "песочницы". Отличие с предыдущей редакцией в функции ReadFile. Для операций чтения и записи используются внешние функции системной библиотеки kernel.dll. Содержимое файла C:\Text.txt сохраняется в строке. Содержимое этой строки записывается в файл C:\Text2.txt.

// File Read Write.mq4
// Скрипт. Положить в папку experts\scripts
 
#property copyright "mandorr@gmail.com"
#include <WinUser32.mqh>
#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, int& buffer[], int bytes);
   int _lwrite (int handle, string buffer, int bytes);
   int _lclose (int handle);
#import
 
void start() 
  {
    string text=ReadFile("C:\Text.txt");
    WriteFile("C:\Text2.txt",text);
    int count=StringLen(text);
    string title="Чтение из файла";
    string msg="Число считанных байт: "+count+"    \n"
    +"Cодержимое файла:\n\n"+text;
    MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
  }
 
string ReadFile (string path) 
  {
    int buffer[], count, handle, i, result;
    string text="";
    handle=_lopen  (path,0);              
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    count =_llseek (handle,0,2);          
    if(count<0)  
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    ArrayResize(buffer,1+count/4);
    result=_llseek (handle,0,0);          
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    result=_lread  (handle,buffer,count); 
    if(result<0) 
      {
        Print("Ошибка чтения файла "  ,path); 
        return ("");
      }
    result=_lclose (handle);              
    if(result<0) 
      {
        Print("Ошибка закрытия файла ",path); 
        return  ("");
      }
    for(i=0; i<ArraySize(buffer); i++) 
      {
        text=text
             +CharToStr(buffer[i]     & 0x000000FF)
             +CharToStr(buffer[i]>> 8 & 0x000000FF)
             +CharToStr(buffer[i]>>16 & 0x000000FF)
             +CharToStr(buffer[i]>>24 & 0x000000FF);
      }
    text=StringSubstr(text,0,count);
    return (text);
  }
 
void WriteFile (string path, string buffer) 
  {
    int handle, result, count=StringLen (buffer); 
    handle=_lopen (path,1);
    if(handle<0) 
      {
        handle=_lcreat (path,0);
        if(handle<0) 
          {
            Print ("Ошибка создания файла ",path);
            return;
          }
        result=_lclose (handle);
      }
    handle=_lopen  (path,1);              
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return;
      }
    result=_llseek (handle,0,0);          
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return;
      }
    result=_lwrite (handle,buffer,count); 
    if(result<0) 
      {
        Print("Ошибка записи в файл " ,path," ",count," байт");
      }
    result=_lclose (handle);              
    if(result<0)  
      {
        Print ("Ошибка закрытия файла ",path);
      }
  }
 
// End

@ Херург
 
Поскольку в MQL4 нет типа данных, соответствующих типу символа - целого числа длинной 1 байт, то по ссылке передается адрес массива целых чисел. Содержимое файла целиком считывается в массив целых чисел. Целое число в MQL4 имеет размер 4 байта. Поэтому после заполнения каждый элемент массива содержит 4 кода символа. Символы извлекаются из массива с помощью побитовых операций и использования функции CharToStr.

@ Херург
 

Подскажите, пожалуйста.

Имеем файл вне "песочницы". Как, не открывая(_lopen()) файл, узнать, что файл был изменен?

 
Смотрите пример Get File Modification Time?
 

Прошу помочь с такой ситуацией.
Имеем, вне "песочницы", файл .txt с текстом внутри.
Как удалить из него весь текст, что б после очистки размер файла был равен 0 байт?
Можно ли это сделать, не открывая(_lopen()) сам файл?

 
Inc писал (а) >>

Прошу помочь с такой ситуацией.
Имеем, вне "песочницы", файл .txt с текстом внутри.
Как удалить из него весь текст, что б после очистки размер файла был равен 0 байт?
Можно ли это сделать, не открывая(_lopen()) сам файл?

_lcreat()

 

Не работает. Пишет ошибку "dill calls are not allowed; 'kernel32.dll'-'_lopen'

как указано файл поместил в раздел скриптов, прокомпилировал. Перетаскиваю скрипт на график, и ничего не происходит.

 
Graalforex >>:

Не работает. Пишет ошибку "dill calls are not allowed; 'kernel32.dll'-'_lopen'

как указано файл поместил в раздел скриптов, прокомпилировал. Перетаскиваю скрипт на график, и ничего не происходит.

https://www.mql4.com/ru/search/dll%20calls%20are%20not%20allowed

 

Разобрался, оказывается вот что надо было сделать :

Советники --> Свойства --> Общие --> Разрешить импорт функций из DLL

Причина обращения: