Скачать MetaTrader 5

Как из советника читать файл на "C:\log.txt" ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Kornishkin
8157
Andrey Kornishkin  

Подскажите пожалуйста простое решение?

Пробовал функции ReadFile.

//+------------------------------------------------------------------+
//|   прочитать файл и вернуть строку с содержимым                   |
//+------------------------------------------------------------------+
string ReadFile (string path) 
  {
    int handle=_lopen (path,OF_READ);           
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    int result=_llseek (handle,0,0);      
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    string buffer="";
    string char1="x";
    int count=0;
    result=_lread (handle,char1,1);
    while(result>0) 
      {
        buffer=buffer+char1;
        char1="x";
        count++;
        result=_lread (handle,char1,1);
     }
    result=_lclose (handle);              
    if(result<0)  
      Print("Ошибка закрытия файла ",path);
    return (buffer);
  }
 

 Функция хорошо бы подошла, но что в ней исправить чтобы работала?

 

//+------------------------------------------------------------------+
//|   прочитать файл и вернуть строку с содержимым                   |
//+------------------------------------------------------------------+
string ReadFile (string path) 
  {
    int handle=_lopen (path,OF_READ);
    int read_size = 50;           
    string char50="x                                                 ";

    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    int result=_llseek (handle,0,0);      
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    string buffer="";
    int count=0;
    int last=0;
    
    result=_lread (handle,char50,read_size);
    while(result>0 && result == read_size) 
      {
        buffer=buffer + char50;
        count++;
        result=_lread (handle,char50,read_size);
        last = result;
     }
    Print("Последний прочитанный блок имеет размер в байтах:", last);
    char50 = StringSubstr(char50,0,last);
    buffer = buffer + char50;    
    result=_lclose (handle);              
    if(result<0)  
      Print("Ошибка закрытия файла ",path);
    return (buffer);
  }
 

Не работает.

 

Смотрел библиотеку: https://www.mql5.com/ru/code/8577
Громоздко, не разобрался. 

Mislaid
621
Mislaid  
AM2:

Подскажите пожалуйста простое решение?

Запустить терминал с ключем portable, а файл поместить в папку ...\MetaTrader 4\MQL4\Files

И не нужны ни какие библиотеки. 

Andrey Kornishkin
8157
Andrey Kornishkin  
Mislaid:

Запустить терминал с ключем portable, а файл поместить в папку ...\MetaTrader 4\MQL4\Files

И не нужны ни какие библиотеки. 

Мне это нужно для непрерывного обмена данными между самописным приложением и МТ4. Прога пишет в любую другую папку а в терминальную нет. Если быть точнее, секунд через 5-10 вылетает ошибка и запись прекращается.

Сейчас пробую такой вариант:

#define OF_EXIST  0x00004000 // Открывает файл затем закрывает это. Используйте это, чтобы тестироваться для существования файла.

#import "kernel32.dll"
   int OpenFile(string lpFileName,int lpReOpenBuff,int wStyle);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int h=0;
   h=OpenFile("C:\\log.txt",0,OF_EXIST);
   Print("Handle: ",h);
  }

 

Но выдает ошибку:      2015.09.05 06:56:19.558   Access violation read to 0x00000000 in 'kernel32.dll'


atztek
279
atztek  
AM2:

Следующее решение точно сработает (сам давно этим пользуюсь), но необходимо потратить немного времени чтобы разобраться.
Погуглите "link shell extension". На этом форуме так же давались описания, поищите.
По большому счету создаете папку где угодно на диске (например в C:\XYZ), а затем - жесткий(е) линк(и) к ней из любой другой папки (например из папки 'Files' MT4). После этого любой файл помещенный в эту папку будет доступен как в оригинальной папке, так и в ее линках, как если бы это была оригинальная папка.
Koldun Zloy
315
Koldun Zloy  
AM2:

Мне это нужно для непрерывного обмена данными между самописным приложением и МТ4. Прога пишет в любую другую папку а в терминальную нет. Если быть точнее, секунд через 5-10 вылетает ошибка и запись прекращается.

Сейчас пробую такой вариант:

 

Но выдает ошибку:      2015.09.05 06:56:19.558   Access violation read to 0x00000000 in 'kernel32.dll'


Второй аргумент функции OpenFile не может быть нулём.

Нужно делать так:

#define OF_EXIST   0x00004000
#define OFS_MAXPATHNAME 128

struct OFSTRUCT
{
  uchar cBytes;
  uchar fFixedDisk;
  ushort nErrCode;
  ushort Reserved1;
  ushort Reserved2;
  uchar szPathName[OFS_MAXPATHNAME];
};

#import "kernel32.dll"
   int OpenFile( string lpFileName, OFSTRUCT& lpReOpenBuff, int wStyle );
#import

void OnStart()
{
   int h = 0;
   OFSTRUCT ofstruct;
   h = OpenFile( "C:\\log.txt", ofstruct, OF_EXIST );
   Print( "Handle: ", h );
}
TarasBY
1740
TarasBY  
AM2:

Подскажите пожалуйста простое решение?


Создайте символическую ссылку на log.txt в "песочнице" терминала и всё будет работать.
Andrey Kornishkin
8157
Andrey Kornishkin  
Благодарен всем за помощь. Сейчас смотрю симлинки, также будет интересно и с win api продолжить.
LRA
646
LRA  
TarasBY:
Создайте символическую ссылку на log.txt в "песочнице" терминала и всё будет работать.
Поясните, пожалуйста, как создать символическую ссылку на файл в "песочнице" терминала
LRA
646
LRA  
Ko1dun:

Нужно делать так:

   int h = 0;
   OFSTRUCT ofstruct;
   h = OpenFile( "C:\\log.txt", ofstruct, OF_EXIST );
   Print( "Handle: ", h );
Print выдает -1, что ИМХО, является признаком ошибки...
TarasBY
1740
TarasBY  
LRA:
Поясните, пожалуйста, как создать символическую ссылку на файл в "песочнице" терминала
Вы погуглили "link shell extension"? После инсталляции в контекстном меню проводника появятся новые пункты. Кликаете правой клавишей на C:\log.txt и выбираете "Запомнить источник ссылки". Затем на папке терминала (файловой "песочнице") - у инсталлированного терминала она в одном месте, у portable в другом - разберётесь сами, опять кликаете правой клавишей и выбираете "Поместить как" -> "Символическую ссылку". Ссылка создана, терминал будет обращаться к ссылке, как к файлу.
LRA
646
LRA  
TarasBY:
Вы погуглили "link shell extension"? После инсталляции ...

Инсталлировать все подряд отучился еще 50 лет назад.

Для одного файла ссылка создается так:

mklink  "X:\ПапкаТерминала\MQL4\Files\A.txt" "Y:\Фильмы\A.txt"

и в папке ...MQL4\Files\ появился файл A.txt

Для папки команда с ключом /D:

mklink /D "X:\ПапкаТерминала\MQL4\Files\BIRD\" "Y:\ICO\"

и в папке ...MQL4\Files\ появилась папка BIRD, а в ней - все содержимое папки Y:\ICO\

Подробнее: http://tigors.net/windows-on-ssd-tweaks/  и  http://kaktusenok.blogspot.ru/2012/05/hardlink-windows-7.html
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий